Tüm yinelenen satırları Python Pandalara bırak


160

Bu pandas drop_duplicatesişlev bir veri çerçevesini "ayırmak" için mükemmeldir. Ancak, iletilecek anahtar kelime bağımsız değişkenlerinden biri take_last=Trueveya take_last=Falsesütunların bir alt kümesinde yinelenen tüm satırları bırakmak istiyorum. Mümkün mü?

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

Örnek olarak, sütunlarla eşleşen satırları bırakmak istiyorum Ave Cbu 0 ve 1 satırlarını bırakmalıdır.

Yanıtlar:


235

Bu, drop_duplicates ve keep parametresi ile artık pandalarda çok daha kolay .

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
Sütunlarım açıkça etiketlenmezse ne olur? Sütunları sadece dizinlerine göre nasıl seçerim?
Hamman Samuel

2
Belki df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Ben

5
deneyebilirsinizdf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi

68

Ben'in drop_duplicates'deki cevabına eklemek istiyorum :

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

  • ilk olarak: İlk olay hariç kopyaları bırakın.

  • last: Son tekrarlama haricinde kopyaları bırakın.

  • False: Tüm kopyaları kaldırın.

Yani keepFalse olarak ayarlamak istediğiniz cevabı verecektir.

DataFrame.drop_duplicates (* args, ** kwargs) Yinelenen satırlar kaldırılmış DataFrame'i döndürün, isteğe bağlı olarak yalnızca belirli sütunlar göz önünde bulundurularak

Parametreler: altküme: sütun etiketi veya etiket dizisi, isteğe bağlı Yalnızca yinelenenleri tanımlamak için belirli sütunları göz önünde bulundurun, varsayılan olarak tüm sütunları kullanın: {'first', 'last', False}, default 'first' first: ilk olay için. last: Son tekrarlama haricinde kopyaları bırakın. False: Tüm kopyaları kaldırın. take_last: inrecify inplace: boolean, default False Yinelenenleri yerinde bırakıp bırakmamak veya bir kopya cols döndürmek için: kwargs yalnızca alt kümenin bağımsız değişkeni [kullanımdan kaldırıldı] Döndürür: yinelenen: DataFrame


26

Sonucun başka bir veri kümesinde saklanmasını istiyorsanız:

df.drop_duplicates(keep=False)

veya

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

Aynı veri kümesinin güncellenmesi gerekiyorsa:

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

Tüm çiftleri elemek ve benzerini, hiç tutacak örneklerle Üstü DISTINCT *SQL


12

kullan groupbyvefilter

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

Aslında, 0 ve 1 numaralı bırakma satırları yalnızca gerektirir (eşleşen A ve C içeren tüm gözlemler saklanır.):

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]

Ama gerçekten ne istediğinizden şüpheleniyorum (eşleşen A ve C içeren bir gözlem tutulur.):

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]

Düzenle:

Şimdi çok daha açık, bu nedenle:

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
İstediğim buysa df.drop_duplicates(['A','C']), varsayılan olarak bir gözlemin ilk veya son soruyu soruda belirttiğim gibi tutmasını isterdim - ancak bellekten yazarken anahtar kelimenin yanlış olduğunu fark ettim. Ne istiyorum ilgi sütunlarında (tüm veriler A ve C) aynı tüm satırları bırakmaktır.
Jamie Bull

0

Bu çeşitli şeyleri deneyin

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

veya

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

veya

>>>df.drop_duplicates( keep='last')
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.