पायथन पंडों में सभी डुप्लिकेट पंक्तियों को छोड़ें


160

pandas drop_duplicatesसमारोह "uniquifying" एक dataframe लिए अच्छा है। हालाँकि, पास करने के लिए एक कीवर्ड तर्क है take_last=Trueया take_last=False, जबकि मैं उन सभी पंक्तियों को छोड़ना चाहूंगा जो कॉलम के सबसेट पर डुप्लिकेट हैं। क्या यह संभव है?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

एक उदाहरण के रूप में, मैं उन पंक्तियों को छोड़ना चाहूंगा जो स्तंभों पर मेल खाते हैं Aऔर Cइसलिए यह पंक्तियों को 0 और 1 छोड़ना चाहिए।

जवाबों:


234

यह ड्रॉप_डुप्लिकेट्स और कीप पैरामीटर के साथ अब पांडा में बहुत आसान है ।

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)

2
क्या होगा यदि मेरे कॉलम स्पष्ट रूप से लेबल नहीं किए गए हैं? मैं केवल उनके सूचकांक के आधार पर कॉलम का चयन कैसे करूं?
हैमैन सैमुअल

2
हो सकता है df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
बेन

5
आप की कोशिश कर सकतेdf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi

68

बस drop_duplicates पर बेन के उत्तर को जोड़ना चाहते हैं :

keep : {'पहला', 'अंतिम', गलत}, डिफ़ॉल्ट 'पहला'

  • पहली: ड्रॉप डुप्लिकेट को छोड़कर पहली घटना।

  • अंतिम: ड्रॉप डुप्लिकेट अंतिम घटना को छोड़कर।

  • मिथ्या: सभी डुप्लिकेट ड्रॉप करें।

तो keepगलत करने के लिए सेटिंग आपको वांछित उत्तर देगा।

DataFrame.drop_duplicates (* args, ** kwargs) डुप्लिकेट पंक्तियों के साथ DataFrame लौटाएं, वैकल्पिक रूप से केवल कुछ कॉलमों पर विचार करके

पैरामीटर: सबसेट: कॉलम लेबल या लेबल का अनुक्रम, वैकल्पिक केवल डुप्लिकेट की पहचान के लिए कुछ स्तंभों पर विचार करते हैं, डिफ़ॉल्ट रूप से सभी स्तंभों का उपयोग करते हैं: {'पहले', 'अंतिम', गलत}, डिफ़ॉल्ट 'पहला' पहला: ड्रॉप डुप्लिकेट को छोड़कर पहली घटना के लिए। अंतिम: ड्रॉप डुप्लिकेट अंतिम घटना को छोड़कर। मिथ्या: सभी डुप्लिकेट ड्रॉप करें। take_last: पदावनत अवस्थापना: बूलियन, डिफ़ॉल्ट गलत चाहे जगह में डुप्लिकेट को छोड़ना हो या किसी प्रतिलिपि कोल्स को वापस करना हो: kwargs केवल सब्मिट का तर्क [पदावनतित] रिटर्न: घटाया: Datarrame


26

यदि आप परिणाम को किसी अन्य डेटासेट में संग्रहीत करना चाहते हैं:

df.drop_duplicates(keep=False)

या

df.drop_duplicates(keep=False, inplace=False)

यदि समान डेटासेट को अद्यतन करने की आवश्यकता है:

df.drop_duplicates(keep=False, inplace=True)

ऊपर दिए गए उदाहरण सभी डुप्लिकेट को निकाल देंगे और DISTINCT *SQL में एक समान रखेंगे


12

का उपयोग करें groupbyऔरfilter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)

5

वास्तव में, ड्रॉप पंक्तियों 0 और 1 को केवल आवश्यकता होती है (मिलान किए गए ए और सी युक्त किसी भी अवलोकन को रखा जाता है।)।

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

लेकिन मुझे संदेह है कि आप वास्तव में क्या चाहते हैं (एक मिलान और ए और सी युक्त अवलोकन रखा गया है।):

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

संपादित करें:

अब यह बहुत स्पष्ट है, इसलिए:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]

1
अगर ऐसा था तो मैं चाहता था, मैं बस के df.drop_duplicates(['A','C'])रूप में उपयोग करता हूँ डिफ़ॉल्ट रूप में एक अवलोकन रखता है पहला या आखिरी ले लो जैसा कि मैंने प्रश्न में उल्लेख किया है - हालांकि मुझे एहसास हुआ है कि मेरे पास कीवर्ड गलत था क्योंकि मैं मेमोरी से लिख रहा था। मैं जो चाहता हूं वह सभी पंक्तियों को गिराना है जो ब्याज के कॉलम (उदाहरण डेटा में ए और सी) पर समान हैं।
जेमी बुल

0

इन विभिन्न चीजों की कोशिश करो

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

या

>>>df.drop_duplicates( keep='first')

या

>>>df.drop_duplicates( keep='last')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.