पंडों डेटाफ्रेम से पंक्तियों की एक सूची कैसे छोड़ें?


259

मेरे पास एक डेटाफ्रेम डीएफ है:

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

फिर मैं कुछ अनुक्रम संख्याओं के साथ पंक्तियों को छोड़ना चाहता हूं जो एक सूची में संकेतित हैं, मान लीजिए कि [1,2,4],तब छोड़ दिया गया है:

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

कैसे या क्या कार्य कर सकते हैं?


बस स्पष्ट करने के लिए, यह प्रश्न विशिष्ट सूचकांक मूल्यों के साथ पंक्तियों को छोड़ने के बारे में है .. उनका उपयोग [1,2,4] छोड़ने के बाद छोड़ी गई पंक्तियों को इंगित करना है । नीचे जवाब दिए गए हैं कि ऐसा करें।
कीमिया

जवाबों:


387

DataFrame.drop का उपयोग करें और इसे इंडेक्स लेबल्स की एक श्रृंखला दें:

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
+1 इसके अलावा, अंतिम पंक्ति df.drop (df.tail (1) .index) छोड़ना
नासिर अल-वाहिबी

15
यह उत्तर केवल तभी काम करता है यदि df.index.unique () df.index के समान है, जो कि पंडों के डेटाफ़्रेम की आवश्यकता नहीं है। क्या किसी के पास कोई समाधान है जब df.index मान अद्वितीय होने की गारंटी नहीं है?
जे जोन्स

2
यह does not सूचकांक नाम पर ही सूचकांक की अनुमति
इंग्रिड

45
दोस्तों, उदाहरण के लिए, यदि आप स्पष्ट होना चाहते हैं, तो कृपया पंक्तियों और स्तंभों के लिए एक ही तार का उपयोग न करें। यह उन लोगों के लिए ठीक है जो वास्तव में अपना सामान पहले से जानते हैं। सीखने की कोशिश करने वालों के लिए निराशा।
gseattle

2
नए लोगों को अजगर पर ध्यान दें: यदि आप इन पंक्तियों को छोड़ना चाहते हैं और उन्हें उसी डेटाफ़्रेम (इनलाइन) में सहेजना चाहते हैं, तो आपको axis=0(0 = पंक्तियों, 1 = कॉलम) को जोड़ने की जरूरत है और इसी inplace=Trueतरह df.drop(df.index[[1,3]], axis=0, inplace=True)। @mezzanaccio, यदि आप विशेष रूप से जानते हैं कि आप किस इंडेक्स को बदलना चाहते हैं (और अपने 0 से n उदाहरण का उपयोग करके भी):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT

112

ध्यान दें कि जब आप लाइन में ड्रॉप करना चाहते हैं तो "inplace" कमांड का उपयोग करना महत्वपूर्ण हो सकता है।

df.drop(df.index[[1,3]], inplace=True)

क्योंकि आपका मूल प्रश्न कुछ भी वापस नहीं कर रहा है, इस आदेश का उपयोग किया जाना चाहिए। http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html


47

यदि DataFrame बहुत बड़ा है, और ड्रॉप करने के लिए पंक्तियों की संख्या बड़ी है, तो इंडेक्स द्वारा सरल ड्रॉप में df.drop(df.index[])बहुत अधिक समय लगता है।

मेरे मामले में, मेरे पास फ़्लोट्स का एक बहु-अनुक्रमित डेटाफ़्रेम है 100M rows x 3 cols, और मुझे इससे 10kपंक्तियों को हटाने की आवश्यकता है। मैंने पाया सबसे तेज़ तरीका, takeशेष पंक्तियों के लिए, काफी स्पष्ट है ।

आज्ञा indexes_to_dropदेना की एक सरणी स्थितीय अनुक्रमित करने के लिए ड्रॉप ( [1, 2, 4]प्रश्न में)।

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

मेरे मामले में यह हुआ 20.5s, जबकि सरल df.dropने 5min 27sबहुत सारी मेमोरी ली और खा ली । परिणामी DataFrame समान है।


43

तुम भी करने के लिए पारित कर सकते हैं DataFrame.drop लेबल ही (बजाय सूचकांक लेबल की श्रृंखला):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

जो इसके बराबर है:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.drop (df.index [0]) भी काम करता है। मेरा मतलब है, डबल स्क्वायर_ ब्रैकेट (पांडा 0.18.1, कम से कम) के लिए कोई ज़रूरत नहीं है
टैगोमा डिक

23

मैंने इसे सरल तरीके से हल किया - सिर्फ 2 चरणों में।

चरण 1: पहले अवांछित पंक्तियों / डेटा के साथ एक डेटाफ्रेम बनाएं।

चरण 2: मूल डेटाफ़्रेम से पंक्तियों को छोड़ने के लिए इस अवांछित डेटाफ़्रेम के सूचकांक का उपयोग करें।

उदाहरण:

मान लीजिए कि आपके पास एक डेटाफ्रेम डीएफ है जो 'एज' सहित कई कॉलम है जो एक पूर्णांक है। अब मान लें कि आप 'आयु' वाली सभी पंक्तियों को ऋणात्मक संख्या के रूप में छोड़ना चाहते हैं।

चरण 1: df_age_negative = df [df ['आयु'] <0]

चरण 2: df = df.drop (df_age_negative.index, धुरी = 0)

आशा है कि यह बहुत सरल है और आपकी मदद करता है।


1
+1, यह एकमात्र उत्तर है जो आपको बताता है कि पहले से अलग कॉलम का चयन करने वाली पंक्ति को कैसे हटाया जाए।
अलेजो बर्नार्डिन

10

यदि मैं एक पंक्ति छोड़ना चाहता हूं, जिसमें मान लें कि सूचकांक है x, तो मैं निम्नलिखित कार्य करूंगा:

df = df[df.index != x]

अगर मैं कई सूचकांकों को छोड़ना चाहता हूं (जैसे कि ये सूचकांक सूची में हैं unwanted_indices), मैं करूंगा:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

यहाँ थोड़ा विशिष्ट उदाहरण है, मैं दिखाना चाहूंगा। मान लें कि आपकी कुछ पंक्तियों में कई डुप्लिकेट प्रविष्टियाँ हैं। यदि आपके पास स्ट्रिंग प्रविष्टियाँ हैं, तो आप आसानी से सभी सूचियों को खोजने के लिए स्ट्रिंग विधियों का उपयोग कर सकते हैं।

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

और अब अपने अनुक्रमणिका का उपयोग करके उन पंक्तियों को छोड़ने के लिए

new_df = df.drop(ind_drop)

3

@ Theodros-zelleke के जवाब में एक टिप्पणी में, @ j-jones ने इस बारे में पूछा कि यदि सूचकांक अद्वितीय नहीं है तो क्या करें। मुझे ऐसी स्थिति से निपटना था। इससे पहले कि मैं drop()एक ला, मैं सूचकांक में डुप्लिकेट का नाम बदलने के लिए क्या किया था :

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

जहां rename_duplicates()एक समारोह मैं परिभाषित है कि सूचकांक के तत्वों के माध्यम से चला गया और डुप्लिकेट नाम दिया है। मैंने उसी नामकरण पैटर्न pd.read_csv()का उपयोग किया जैसा कि कॉलम पर उपयोग किया जाता है, अर्थात "%s.%d" % (name, count), जहां nameपंक्ति का नाम है और countयह कितनी बार पहले हुआ है।


1

ऊपर बताए अनुसार बूलियन से सूचकांक का निर्धारण

df[df['column'].isin(values)].index

इस पद्धति का उपयोग करके सूचकांक का निर्धारण करने की तुलना में अधिक स्मृति गहन हो सकती है

pd.Index(np.where(df['column'].isin(values))[0])

ऐसा लागू किया गया

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

बड़े डेटाफ्रेम और सीमित मेमोरी से निपटने के दौरान यह विधि उपयोगी है।


0

पंक्ति को छोड़ने के लिए केवल सूचकांक आर्ग का उपयोग करें: -

df.drop(index = 2, inplace = True)

कई पंक्तियों के लिए: -

df.drop(index=[1,3], inplace = True)

0

एक उदाहरण पर विचार करें डेटाफ़्रेम

df =     
index    column1
0           00
1           10
2           20
3           30

हम दूसरी और तीसरी अनुक्रमणिका पंक्तियों को छोड़ना चाहते हैं।

दृष्टिकोण 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

दृष्टिकोण २

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.