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