कॉपी के रूप में नए डेटाफ्रेम के लिए विशिष्ट चयनित कॉलम निकालना


185

मेरे पास 4 कॉलम के साथ एक पांडा डेटाफ़्रेम है और मैं एक नया डेटाफ़्रेम बनाना चाहता हूं जिसमें केवल तीन कॉलम हों। यह प्रश्न समान है: किसी डेटा फ़्रेम से विशिष्ट स्तंभों को निकालना, लेकिन पंडों के लिए नहीं। आर। निम्न कोड काम नहीं करता है, एक त्रुटि उठाता है, और निश्चित रूप से इसे करने के लिए पंडासनिक तरीका नहीं है।

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator 

इसे करने का पांडासनिक तरीका क्या है?

जवाबों:


359

ऐसा करने का एक तरीका है और यह वास्तव में R के समान दिखता है

new = old[['A', 'C', 'D']].copy()

यहां आप केवल उन कॉलमों का चयन कर रहे हैं जो आप मूल डेटा फ्रेम से चाहते हैं और उन के लिए एक वैरिएबल बना रहे हैं। यदि आप नई डेटाफ़्रेम को बिल्कुल संशोधित करना चाहते हैं, तो आप संभवतः .copy()बचने के लिए उपयोग करना चाहते हैं SettingWithCopyWarning

एक वैकल्पिक विधि का उपयोग करना है filterजो डिफ़ॉल्ट रूप से एक प्रति बनाएगा:

new = old.filter(['A','B','D'], axis=1)

अंत में, आपके मूल डेटाफ़्रेम में स्तंभों की संख्या के आधार पर, यह एक का उपयोग करके इसे व्यक्त करने के लिए अधिक उपयुक्त हो सकता है drop(यह डिफ़ॉल्ट रूप से एक प्रतिलिपि भी बनाएगा):

new = old.drop('B', axis=1)

20
एक कॉलम को कॉपी करते समय सावधानी: old[['A']].copy()एक नया डेटा फ्रेम बनाने के लिए डबल स्क्वायर ब्रैकेट की आवश्यकता होती है। ध्यान दें कि old['A'].copy()केवल एक श्रृंखला बनाएंगे।
इंटेकचो

19

सबसे आसान तरीका है

new = old[['A','C','D']]


3
जब तक आप स्पष्ट रूप से .copy ()
सिल्वेन

यह प्रतियां डिफ़ॉल्ट रूप से है।
नगुई अल

2
@ सरल अनुक्रमण का व्यवहार निर्दिष्ट नहीं है। आपको पता नहीं चलेगा कि आपको एक कॉपी या एक दृश्य मिलता है। अधिक विवरण के लिए प्रलेखन देखें: pandas.pydata.org/pandas-docs/stable/user_guide/…
Ole Fass

8

एक और सरल तरीका लगता है:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

old.column_nameआप एक श्रृंखला कहां देंगे। उन सभी स्तंभ-श्रृंखलाओं की एक सूची बनाएं जिन्हें आप डेटाफ़्रेम कंस्ट्रक्टर को बनाए रखना और पास करना चाहते हैं। हमें आकृति को समायोजित करने के लिए एक संक्रमण करने की आवश्यकता है।

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

काम करता है, लेकिन नहीं तो column_name में विशेष वर्ण हैं।
जिम्ह

ओह ने ऐसा नहीं सोचा था
मारो

3

सामान्य कार्यात्मक रूप

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

ऊपर आपकी समस्या के लिए विशिष्ट

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

यदि आप एक नया डेटा फ्रेम करना चाहते हैं तो:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]

1

जहां तक ​​मैं बता सकता हूं, आपको फ़िल्टर फ़ंक्शन का उपयोग करते समय धुरी को निर्दिष्ट करने की आवश्यकता नहीं है।

new = old.filter(['A','B','D'])

के रूप में एक ही डेटाफ़्रेम देता है

new = old.filter(['A','B','D'], axis=1)

1

सूचकांक द्वारा कॉलम:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.