Python'da pandaları kullanan tüm yinelenen öğelerin bir listesini nasıl alabilirim?


129

Bazı ihracat sorunları olması muhtemel öğelerin bir listesi var. El ile karşılaştırabilmek için yinelenen öğelerin bir listesini almak istiyorum. Pandaların çoğaltılmış yöntemini kullanmaya çalıştığımda , yalnızca ilk kopyayı döndürüyor. Yalnızca ilkini değil de tüm kopyaları almanın bir yolu var mı?

Veri kümemin küçük bir alt bölümü şuna benzer:

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

Kodum şu anda şöyle görünüyor:

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

Birkaç yinelenen öğe var. Ancak yukarıdaki kodu kullandığımda yalnızca ilk öğeyi alıyorum. API referansında, son öğeyi nasıl alabileceğimi görüyorum, ancak hepsine sahip olmak istiyorum, böylece onları neden tutarsızlığa uğradığımı görmek için görsel olarak inceleyebilirim. Bu nedenle, bu örnekte, sadece birincisi yerine üç A036 girişini ve hem 11795 girişi hem de diğer çoğaltılmış girişleri almak istiyorum. Herhangi bir yardım en çok takdir edilmektedir.


1
"Yinelemeler" çeşitli şeyler ifade edebilir "Sizin durumunuzda, " birden çok sütunda veya tüm sütunlarda aynı olan satırları "değil, yalnızca tek bir sütundaki kopyalarıID dikkate almak istiyorsunuz .
smci

Yanıtlar:


170

Yöntem # 1: Kimliğin yinelenen kimliklerden biri olduğu tüm satırları yazdırın:

>>> 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

ama idsbu kadar çok tekrarı önlemek için güzel bir yol düşünemedim . 2. yöntemi tercih ediyorum: groupbykimlik üzerinde.

>>> 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. Yöntem tek kelimeyle mükemmel! Çok teşekkür ederim.
BigHandsome

4
Yöntem 2, yineleme yoksa başarısız olur ("Birleştirilecek nesne yok")
CPBL

4
ne gelmez g for _ mi?
user77005

5
@ user77005 zaten anlamış olabilirsiniz, ancak herkesin yararına, şöyle okur g for (placeholder, g) in df.groupby('bla') if 'bla':; alt çizgi, lambda benzeri bir ifadede onu herhangi bir şey için kullanmak istemediğimiz kaçınılmaz bir argümanın yer tutucusu için tipik bir semboldür.
stucash

7
Yöntem 1'in güncellenmesi gerekiyor: sortDataFrames için kullanımdan kaldırıldı sort_valuesveya sort_index İlgili SO Soru-Cevap
tatlar

138

Pandas sürüm 0.17 ile, tüm yinelenen öğeleri almak için yinelenen işlevde 'tut = False' ayarlayabilirsiniz .

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
Bingo, cevap burada. Yani: str veya str veya boolean ... garip API seçimi. 'all'daha mantıklı ve sezgisel bir IMO olacaktır.
Jarad

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

yinelenen tüm satırları size geri döndürür.

Belgelere göre :

tutmak: {'ilk', 'son', Yanlış}, varsayılan 'ilk'

  • ilk: İlk oluşum dışında yinelenenleri True olarak işaretleyin.
  • son: Son oluşum haricinde yinelenenleri Doğru olarak işaretleyin.
  • Yanlış: Tüm kopyaları Doğru olarak işaretleyin.

@dreme bu sözdizimsel olarak doğru değil, işe yaramıyor. Eşleşmeyen ']' ve ayrıca ihtiyaç duydukları şeyi geri getirmez. Daha kısa ama yanlış.
FinancialRadDeveloper

Oops, her iki konuda da haklısın @FinancialRadDeveloper. Yorumumu sileceğim. Hatayı aldığınız için teşekkürler.
dreme

4
df [df ['ID']. duplicated () == True] Bu, tüm kopyaları döndürecektir
Hariprasad

12

Yorum yapamadığım için ayrı bir cevap olarak gönderiyorum

Birden fazla sütun temelinde yinelenenleri bulmak için, her sütun adını aşağıdaki gibi belirtin ve size yinelenen tüm satır kümesini döndürecektir:

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

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

Bu benim için çalıştı


2
Aslında eklemeniz gerekmez == True, .duplicated()zaten bool dizisi döndürür.
Jakub Wagner

3

Element-akıllı bir mantık kullanarak veya ve pandaların çoğaltılmış yönteminin take_last bağımsız değişkenini hem Doğru hem de Yanlış olarak ayarlayarak, veri çerçevenizden tüm kopyaları içeren bir küme elde edebilirsiniz.

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

2

Bu soruya bir çözüm olmayabilir, ancak örnekleri göstermek için:

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)

Çıktılar:

   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")şu anda çalışmıyor gibi görünüyor, sıralama belgesine göre kullanımdan kaldırılmış gibi görünüyor , bu nedenle sort_values("ID")aşağıdaki gibi yinelenen filtreden sonra sıralamak için kullanın :

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

2

Çoğaltılmış veritabanım için (keep = False), sütun sıralanana kadar çalışmadı.

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
Lütfen cevabınızı daha detaylı bir açıklama ile uzatır mısınız? Bu, anlamak için çok faydalı olacaktır. Teşekkür ederim!
vezunchik

Stack Overflow'a hoş geldiniz ve katkınız için teşekkürler! Cevabınızı bir açıklama ile uzatırsanız çok naziksiniz. Burada nasıl iyi bir cevap verileceğine dair bir rehber bulacaksınız . Teşekkürler!
David
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.