पंडों में स्तंभ नामों के आधार पर कई कॉलम हटाना


94

मेरे पास कुछ डेटा है और जब मैं इसे आयात करता हूं तो मुझे निम्नलिखित अनावश्यक कॉलम मिलते हैं जो मैं इन सभी को हटाने का एक आसान तरीका ढूंढ रहा हूं

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

वे 0-इंडेक्सिंग द्वारा अनुक्रमित हैं इसलिए मैंने कुछ ऐसा करने की कोशिश की

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

लेकिन यह बहुत कुशल नहीं है। मैंने लूप के लिए कुछ लिखने की कोशिश की लेकिन इसने मुझे खराब पंडों के व्यवहार के रूप में प्रभावित किया। इसलिए मैं यहां सवाल पूछता हूं।

मैंने कुछ उदाहरण देखे हैं जो समान हैं ( ड्रॉप मल्टीपल कॉलम पांडा ) लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है।


2
आपका क्या मतलब है, कुशल? क्या यह बहुत धीमी गति से चल रहा है? यदि आपकी समस्या यह है कि आप उन सभी स्तंभों के सूचकांक प्राप्त नहीं करना चाहते हैं जिन्हें आप हटाना चाहते हैं, तो कृपया ध्यान दें कि आप केवल df.dropस्तंभ नामों की एक सूची दे सकते हैं :df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
Carsten

क्या केवल ब्याज df = df[cols_of_interest]के कॉलम को df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
घटाना

2
टाइपिंग या 'बैड कोड
स्मेल

1
ध्यान देने योग्य बात यह हो सकती है कि ज्यादातर मामलों में यह आसान है कि आप जो कॉलम चाहते हैं उसे अपने पास रखें, जिन्हें आप नहीं हटाते हैं: df = df ['col_list']
गौरैया

जवाबों:


65

मुझे नहीं पता कि आप अक्षम से क्या मतलब रखते हैं लेकिन अगर आप टाइप करने के संदर्भ में हैं तो यह आसान हो सकता है कि आप ब्याज के क्षेत्र का चयन करें और df पर वापस जाएं।

df = df[cols_of_interest]

कहाँ पे cols_of_interestआपके द्वारा देखभाल किए जाने वाले स्तंभों की एक सूची है।

या आप कॉलम को स्लाइस कर सकते हैं और इसे पास कर सकते हैं drop:

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

के लिए कॉल head केवल 0 पंक्तियों का चयन करता है क्योंकि हम डेटा के बजाय केवल कॉलम नामों में रुचि रखते हैं

अपडेट करें

एक अन्य विधि: बूलियन मास्क का उपयोग करना सरल होगा str.containsऔर स्तंभों को मास्क करने के लिए इसे उल्टा करें:

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []

मुझे त्रुटि तब मिलती है जब मैं या तो करने की कोशिश करता हूं ~ df.columns ... (TypeError: bad operand type for unary ~: 'str') या df.columns.str.contains ... (AttractError: 'Index') में कोई विशेषता नहीं है। 'str')। किसी भी विचार क्यों यह हो सकता है?
दाई

@EdChum क्या मैं df = df [cols_of_interest] बना सकता हूं , जहां cols_of_interest लूप पुनरावृत्तियों के लिए हर बार एक कॉलम नाम जोड़ता है?

@Victor नहीं अगर आप ऐसा करते हैं कि आप dfअपने नए कॉलम के साथ अपना ओवरराइट कर लेते हैं जो आपको appendशायद करना चाहिए, लेकिन मैं वास्तव में आपके प्रश्न को नहीं समझता हूं, तो आपको एसओ पर एक वास्तविक प्रश्न पोस्ट करना चाहिए, बजाय इसके कि एसओ पर एक खराब फॉर्म के रूप में पूछें
EdChum

@EdChum तुम बिल्कुल सही हो। मैंने प्रश्न बनाया है और मैं SO के विभिन्न भागों को खोजकर इसे हल करने का प्रयास कर रहा हूं। लिंक यहां दिया गया है ! किसी भी योगदान में मदद मिलेगी stackoverflow.com/questions/48923915/…

212

अब तक का सबसे सरल तरीका है:

yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)

1
मैंने अपने कुछ कोड में इस प्रारूप का उपयोग किया है और मुझे एक SettingWithCopyWarningचेतावनी मिली है ?
किलर्सनेल

2
@KillerSnail, इसे नजरअंदाज करने के लिए बचा है। त्रुटि से बचने के लिए, प्रयास करें: df = df.drop (['colheading1', 'colheading2'], धुरी = 1)
Philipp Schwarz

5
शब्द axisसमझाया गया: stackoverflow.com/questions/22149584/… । अनिवार्य रूप से, axis=0"स्तंभ-वार" कहा जाता है और axis=1"पंक्ति-वार" है।
रोहमर

5
और inplace=Trueइसका मतलब है कि DataFrameजगह में संशोधित किया गया है।
रोहमर

1
अगर आप चेतावनी नहीं चाहते हैं, तो yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
@Killernail

41

मेरे व्यक्तिगत पसंदीदा, और मेरे द्वारा देखे गए उत्तरों की तुलना में आसान (कई कॉलमों के लिए):

df.drop(df.columns[22:56], axis=1, inplace=True)

या कई कॉलम के लिए एक सूची बना रहे हैं।

col = list(df.columns)[22:56]
df.drop(col, axis=1, inplace=1)

8
इसका उत्तर होना चाहिए। सबसे सरल, पढ़ने में आसान, सीधा देशी पंडों का अनुक्रमण वाक्य-विन्यास।
ब्रेंट फॉस्ट

2
इस उत्तर के पास हरे रंग की टिक होनी चाहिए, दूसरों की नहीं।
सियावोश महबूबन

1
छोटा सुधार (जब तक मैं गलत नहीं हूँ): कोड के दूसरे ब्लॉक में 'inplace = 1' के बजाय 'inplace = true' होना चाहिए।
थ्रेडोलेंस

20

यह शायद आप क्या चाहते हैं करने के लिए एक अच्छा तरीका है। यह उन सभी स्तंभों को हटा देगा जिनमें उनके हेडर में '' हैं।

for col in df.columns:
    if 'Unnamed' in col:
        del df[col]

इसे for col in df.columns:सरल किया जा सकता है for col in df:, साथ ही ओपी ने यह संकेत नहीं दिया है कि अन्य स्तंभों के लिए नामकरण योजना क्या है, वे सभी में 'शामिल' हो सकते हैं, यह भी अक्षम है क्योंकि यह एक बार में एक कॉलम को हटा देता है
EdChum

यह निश्चित रूप से कुशल नहीं है, लेकिन जब तक हम विशाल डेटाफ़्रेम पर काम नहीं कर रहे हैं, तब तक इसका महत्वपूर्ण प्रभाव नहीं होगा। इस पद्धति का प्लस पॉइंट यह है कि यह याद रखना आसान है और कोड को फास्ट करना है - उन कॉलम की एक सूची बनाते समय जिन्हें आप रखना चाहते हैं वे बहुत दर्दनाक हो सकते हैं।
नाइटफोनी

मुझे लगता है कि यह बड़े df पर सबसे अधिक प्रदर्शन करने की संभावना है क्योंकि आपको इसके साथ एक स्थानीय प्रतिलिपि बनाने की ज़रूरत नहीं हैinplace = True
मैट

13

आप इसे एक पंक्ति में और एक बार कर सकते हैं:

df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)

इसमें ऊपर दिए गए समाधानों की तुलना में वस्तु का कम घूमना / प्रतिलिपि बनाना शामिल है।


11

निश्चित नहीं है कि यह समाधान अभी तक कहीं भी उल्लेखित किया गया है लेकिन ऐसा करने का एक तरीका है pandas.Index.difference

>>> df = pd.DataFrame(columns=['A','B','C','D'])
>>> df
Empty DataFrame
Columns: [A, B, C, D]
Index: []
>>> to_remove = ['A','C']
>>> df = df[df.columns.difference(to_remove)]
>>> df
Empty DataFrame
Columns: [B, D]
Index: []

4

आप केवल अक्ष को 0 या 1 के रूप में निर्दिष्ट करने के साथ एक सूची के रूप में कॉलम नामों को पारित कर सकते हैं

  • धुरी = 1: पंक्तियों के साथ
  • अक्ष = 0: कॉलम के साथ
  • डिफ़ॉल्ट अक्ष = 0 से

    data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)


4

सरल और आसान। 22 वें के बाद सभी कॉलम निकालें।

df.drop(columns=df.columns[22:]) # love it

dfजगह में संशोधन करने के लिए , झंडा जोड़ें inplace=True, ताकिdf.drop(columns=df.columns[22:], inplace=True)
arilwan

1

नीचे मेरे लिए काम किया:

for col in df:
    if 'Unnamed' in col:
        #del df[col]
        print col
        try:
            df.drop(col, axis=1, inplace=True)
        except Exception:
            pass

0

df = df[[col for col in df.columns if not ('Unnamed' in col)]]


1
यह पीटर के समान है सिवाय इसके कि अवांछित स्तंभों को गिराए जाने के बजाय फ़िल्टर किया गया है।
सारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.