मुझे अजगर में पांडा का उपयोग करने वाले सभी डुप्लिकेट आइटमों की सूची कैसे मिलेगी?


127

मेरे पास उन वस्तुओं की एक सूची है जिनमें कुछ निर्यात की संभावना है। मैं डुप्लिकेट आइटम की एक सूची प्राप्त करना चाहूंगा ताकि मैं मैन्युअल रूप से उनकी तुलना कर सकूं। जब मैं पांडा डुप्लिकेट विधि का उपयोग करने की कोशिश करता हूं , तो यह केवल पहला डुप्लिकेट लौटाता है। वहाँ सभी डुप्लिकेट पाने के लिए एक ही रास्ता है और न केवल पहले एक?

मेरे डेटासेट की एक छोटी उपधारा इस तरह दिखती है:

ID,ENROLLMENT_DATE,TRAINER_MANAGING,TRAINER_OPERATOR,FIRST_VISIT_DATE
1536D,12-Feb-12,"06DA1B3-Lebanon NH",,15-Feb-12
F15D,18-May-12,"06405B2-Lebanon NH",,25-Jul-12
8096,8-Aug-12,"0643D38-Hanover NH","0643D38-Hanover NH",25-Jun-12
A036,1-Apr-12,"06CB8CF-Hanover NH","06CB8CF-Hanover NH",9-Aug-12
8944,19-Feb-12,"06D26AD-Hanover NH",,4-Feb-12
1004E,8-Jun-12,"06388B2-Lebanon NH",,24-Dec-11
11795,3-Jul-12,"0649597-White River VT","0649597-White River VT",30-Mar-12
30D7,11-Nov-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",30-Nov-11
3AE2,21-Feb-12,"06405B2-Lebanon NH",,26-Oct-12
B0FE,17-Feb-12,"06D1B9D-Hartland VT",,16-Feb-12
127A1,11-Dec-11,"064456E-Hanover NH","064456E-Hanover NH",11-Nov-12
161FF,20-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",3-Jul-12
A036,30-Nov-11,"063B208-Randolph VT","063B208-Randolph VT",
475B,25-Sep-12,"06D26AD-Hanover NH",,5-Nov-12
151A3,7-Mar-12,"06388B2-Lebanon NH",,16-Nov-12
CA62,3-Jan-12,,,
D31B,18-Dec-11,"06405B2-Lebanon NH",,9-Jan-12
20F5,8-Jul-12,"0669C50-Randolph VT",,3-Feb-12
8096,19-Dec-11,"0649597-White River VT","0649597-White River VT",9-Apr-12
14E48,1-Aug-12,"06D3206-Hanover NH",,
177F8,20-Aug-12,"063B208-Randolph VT","063B208-Randolph VT",5-May-12
553E,11-Oct-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",8-Mar-12
12D5F,18-Jul-12,"0649597-White River VT","0649597-White River VT",2-Nov-12
C6DC,13-Apr-12,"06388B2-Lebanon NH",,
11795,27-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",19-Jun-12
17B43,11-Aug-12,,,22-Oct-12
A036,11-Aug-12,"06D3206-Hanover NH",,19-Jun-12

मेरा कोड वर्तमान में इस तरह दिखता है:

df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]

वहाँ एक युगल डुप्लिकेट आइटम क्षेत्र। लेकिन, जब मैं उपरोक्त कोड का उपयोग करता हूं, तो मुझे केवल पहला आइटम मिलता है। एपीआई संदर्भ में, मैं देखता हूं कि मैं अंतिम आइटम कैसे प्राप्त कर सकता हूं, लेकिन मैं उन सभी को पसंद करना चाहूंगा, इसलिए मैं नेत्रहीन निरीक्षण कर सकता हूं कि मुझे विसंगति क्यों हो रही है। इसलिए, इस उदाहरण में मैं सभी तीन A036 प्रविष्टियों और दोनों 11795 प्रविष्टियों और किसी भी अन्य दोहराई गई प्रविष्टियों को प्राप्त करना चाहूंगा, केवल पहले वाले के बजाय। कोई मदद सबसे सराहना की है।


1
"डुप्लिकेट्स" का मतलब विभिन्न चीजों से हो सकता है "आपके मामले में, आप केवल एक ही कॉलम में डुप्लिकेटID पर विचार करना चाहते हैं , न कि" कई या सभी कॉलम में समान पंक्तियाँ "।
बजे

जवाबों:


170

विधि # 1: उन सभी पंक्तियों को प्रिंट करें जहां ID डुप्लिकेट में ID में से एक है:

>>> import pandas as pd
>>> df = pd.read_csv("dup.csv")
>>> ids = df["ID"]
>>> df[ids.isin(ids[ids.duplicated()])].sort("ID")
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

लेकिन मैं idsइतनी बार दोहराने से रोकने के लिए एक अच्छा तरीका नहीं सोच सकता । मैं groupbyआईडी पर विधि # 2: को प्राथमिकता देता हूं ।

>>> pd.concat(g for _, g in df.groupby("ID") if len(g) > 1)
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

11
विधि # 2 सिर्फ सही है! बहुत बहुत धन्यवाद।
BigHandsome

4
विधि # 2 विफल रहता है ("कोई वस्तु को समाप्‍त करने के लिए नहीं") यदि कोई डुप नहीं है
CPBL

4
क्या करता g for _ है?
user77005

5
@ user77005 आपको पहले ही पता चल गया होगा, लेकिन हर किसी के लाभ के लिए, यह इस तरह से पढ़ता है g for (placeholder, g) in df.groupby('bla') if 'bla':; अंडरस्कोर एक अपरिहार्य तर्क के प्लेसहोल्डर के लिए एक विशिष्ट प्रतीक है जहां हम इसे लैम्ब्डा जैसी अभिव्यक्ति में किसी भी चीज के लिए उपयोग नहीं करना चाहते हैं।
0

7
विधि # 1 की जरूरत है अद्यतन करने की: sortके पक्ष में DataFrames के लिए हटा दिया गया था या तो sort_valuesया sort_index संबंधित एसओ क्यू एंड ए
tatlar

138

पंडास संस्करण 0.17 के साथ, आप सभी डुप्लिकेट आइटम प्राप्त करने के लिए डुप्लिकेट किए गए फ़ंक्शन में 'कीप = गलत' सेट कर सकते हैं ।

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(['a','b','c','d','a','b'])

In [3]: df
Out[3]: 
       0
    0  a
    1  b
    2  c
    3  d
    4  a
    5  b

In [4]: df[df.duplicated(keep=False)]
Out[4]: 
       0
    0  a
    1  b
    4  a
    5  b

3
बिंगो, वहाँ जवाब है। तो: str या str या बूलियन ... विषम API पसंद। 'all'अधिक तार्किक और सहज IMO होगा।
जरद

92
df[df.duplicated(['ID'], keep=False)]

यह सभी डुप्लिकेट पंक्तियों को आपके पास वापस लौटा देगा।

प्रलेखन के अनुसार :

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

  • पहला: मार्क पहली घटना को छोड़कर सच के रूप में डुप्लिकेट करता है।
  • अंतिम: मार्क अंतिम घटना को छोड़कर सच के रूप में डुप्लिकेट करता है।
  • मिथ्या: सभी डुप्लिकेट को सही के रूप में चिह्नित करें।

@ यह सिंटिकली सही नहीं है, न ही यह काम करता है। बेमेल ']' और यह भी वापस नहीं आता है कि उन्हें क्या चाहिए। इसका छोटा, लेकिन गलत है।
FinancialRadDeveloper

ओह, आप दोनों काउंट पर सही @Fin FinancialRadDeveloper हैं। मैं अपनी टिप्पणी हटा दूंगा। त्रुटि को उठाने के लिए धन्यवाद।
9

3
df [df ['ID']। डुप्लिकेट () == सही] यह सभी डुप्लिकेट लौटाएगा
हरिप्रसाद

12

जैसा कि मैं टिप्पणी करने में असमर्थ हूं, इसलिए एक अलग उत्तर के रूप में पोस्ट कर रहा हूं

एक से अधिक कॉलम के आधार पर डुप्लिकेट खोजने के लिए, नीचे दिए गए प्रत्येक कॉलम के नाम का उल्लेख करें, और यह आपको सभी डुप्लिकेट पंक्तियों को सेट करेगा:

df[df[['product_uid', 'product_title', 'user']].duplicated() == True]


3

एक तत्व-वार तार्किक का उपयोग करना या पंडों के डुप्लिकेटेड विधि के take_last तर्क को सही और गलत दोनों के लिए सेट करना आप अपने डेटाफ़्रेम से एक सेट प्राप्त कर सकते हैं जिसमें सभी डुप्लिकेट शामिल हैं।

df_bigdata_duplicates = 
    df_bigdata[df_bigdata.duplicated(cols='ID', take_last=False) |
               df_bigdata.duplicated(cols='ID', take_last=True)
              ]

2

यह सवाल का हल नहीं हो सकता है, लेकिन उदाहरणों को समझने के लिए:

import pandas as pd

df = pd.DataFrame({
    'A': [1,1,3,4],
    'B': [2,2,5,6],
    'C': [3,4,7,6],
})

print(df)
df.duplicated(keep=False)
df.duplicated(['A','B'], keep=False)

आउटपुट:

   A  B  C
0  1  2  3
1  1  2  4
2  3  5  7
3  4  6  6

0    False
1    False
2    False
3    False
dtype: bool

0     True
1     True
2    False
3    False
dtype: bool

2

sort("ID")अब काम करने के लिए प्रतीत नहीं होता है, क्रमबद्ध दस्तावेज़ के अनुसार पदावनत लगता है , इसलिए sort_values("ID")डुप्लिकेट फ़िल्टर के बाद छाँटने के बजाय इसका उपयोग करें , निम्नानुसार:

df[df.ID.duplicated(keep=False)].sort_values("ID")

2

मेरे डेटाबेस के लिए डुप्लिकेट (रखने = गलत) तब तक काम नहीं किया गया जब तक कि कॉलम को सॉर्ट नहीं किया गया।

data.sort_values(by=['Order ID'], inplace=True)
df = data[data['Order ID'].duplicated(keep=False)]

1

df[df.duplicated(['ID'])==True].sort_values('ID')


4
कृपया, क्या आप अधिक विस्तृत विवरण के साथ अपने उत्तर का विस्तार कर सकते हैं? यह समझने के लिए बहुत उपयोगी होगा। धन्यवाद!
vezunchik

आपका स्वागत है ढेर अतिप्रवाह और आपके योगदान के लिए धन्यवाद! यदि आप एक स्पष्टीकरण के माध्यम से उत्तर दे सकते हैं तो यह दयालु होगा। यहां आपको एक गाइड मिलता है कि कैसे एक अच्छा जवाब देना है । धन्यवाद!
डेविड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.