Upuść wszystkie zduplikowane wiersze na wiele kolumn w Pythonie

The pandas drop_duplicates funkcja jest świetna do "unikania" ramki danych. Jednak jednym z argumentów słowa kluczowego do przekazania jest take_last=True lub take_last=False, podczas gdy chciałbym upuścić wszystkie wiersze, które są duplikatami w podzbiorze kolumn. Czy to możliwe?

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

Jako przykład chciałbym upuścić wiersze, które pasują do kolumn A i C, więc powinno to upuścić wiersze 0 i 1.

Author: Georgy, 2014-05-15

6 answers

Jest to znacznie łatwiejsze w pandach teraz z drop_duplikates i parametrem keep.

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)
 259
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-12 19:10:01

Chcę tylko dodać do odpowiedzi Bena na drop_duplikaty :

keep : {'first', 'last', False}, default 'first'

  • Po pierwsze: upuść duplikaty z wyjątkiem pierwszego wystąpienia.

  • Ostatni: duplikaty upuszczania z wyjątkiem ostatniego wystąpienia.

  • False: wyrzuć wszystkie duplikaty.

Więc ustawienie keep Na False da ci żądaną odpowiedź.

DataFrame.drop_duplicates (*args, * * kwargs) Return DataFrame z zduplikowane wiersze usunięte, opcjonalnie tylko biorąc pod uwagę niektóre kolumny

Parametry: podzbiór: etykieta kolumny lub Sekwencja etykiet, opcjonalnie Domyślnie należy wziąć pod uwagę tylko niektóre kolumny do identyfikacji duplikatów użyj wszystkich kolumn keep: {'first',' last', False}, default "first" first: upuść duplikaty z wyjątkiem pierwszego wystąpienia. ostatni : Upuść duplikaty z wyjątkiem ostatniego wystąpienia. False : Drop all duplikaty. take_last : deprecated inplace : boolean, default False Czy wrzucić duplikaty na miejsce czy zwrócić kopię: kwargs jedyny argument podzbioru [deprecated] zwraca: deduplicated : DataFrame

 78
Author: Jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-04 22:41:38

Jeśli chcesz, aby wynik był przechowywany w innym zbiorze danych:

df.drop_duplicates(keep=False)

Lub

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

Jeśli ten sam zbiór danych wymaga aktualizacji:

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

Powyższe przykłady usuną wszystkie duplikaty i zachowają jeden, podobny do DISTINCT * w SQL

 34
Author: Ramanujam Allam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-13 09:07:14

Użyj groupby i 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)
 14
Author: HYRY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-17 08:27:41

W rzeczywistości, spadek wierszy 0 i 1 wymaga tylko (wszelkie obserwacje zawierające dopasowane a i C są przechowywane.):

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]

Ale podejrzewam, że naprawdę chcesz tego (jedna obserwacja zawierająca dopasowane A I C jest zachowana.):

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]

Edit:

Teraz jest znacznie jaśniejsze, dlatego:

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]
 7
Author: CT Zhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-15 01:38:52

Spróbuj tych różnych rzeczy

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

Lub

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

Lub

>>>df.drop_duplicates( keep='last')
 1
Author: Priyansh gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-15 10:44:40