Mam ramkę danych pand, df
takich jak:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Chcę pogrupować według pierwszej kolumny i uzyskać drugą kolumnę jako listy w wierszach :
A [1,2]
B [5,5,4]
C [6]
Czy można zrobić coś takiego za pomocą Panda Groupby?
Możesz to zrobić za pomocą groupby
grupowania według kolumny zainteresowań, a następnie apply
list
każdej grupy:
In [1]: df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]})
df
Out[1]:
a b
0 A 1
1 A 2
2 B 5
3 B 5
4 B 4
5 C 6
In [2]: df.groupby('a')['b'].apply(list)
Out[2]:
a
A [1, 2]
B [5, 5, 4]
C [6]
Name: b, dtype: object
In [3]: df1 = df.groupby('a')['b'].apply(list).reset_index(name='new')
df1
Out[3]:
a new
0 A [1, 2]
1 B [5, 5, 4]
2 C [6]
tuple
po drugim odpowiedź tutaj: stackoverflow.com/questions/19530568/... . Wyjaśnienia znajdują się w drugiej odpowiedzi na stackoverflow.com/questions/27439023/ ...Jeśli wydajność jest ważna, przejdź do poziomu numpy:
Testy:
źródło
.groupby([df.index.month, df.index.day])
Zamiast zamiast.groupby('a')
?Przydatnym sposobem na osiągnięcie tego byłoby:
Zajrzyj do pisania Niestandardowe agregacje: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py
źródło
lambda args: f(args)
jest równoważne zf
agg(list)
to wystarczy. Zobacz także tutaj .df.groupby('a').apply(list)
albo użyć z agiem jako części dyktadf.groupby('a').agg({'b':list})
. Możesz również użyć go z lambda (co polecam), ponieważ możesz zrobić o wiele więcej z nim. Przykład:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})
który pozwala zastosować funkcję szeregową do kolumny c i unikalną, a następnie funkcję listy do kolumny b.Jak mówiłeś,
groupby
metodapd.DataFrame
obiektu może wykonać zadanie.Przykład
który daje i grupuje opis grup.
Aby uzyskać elementy pojedynczych grup, możesz na przykład to zrobić
źródło
Aby rozwiązać ten problem dla kilku kolumn ramki danych:
Ta odpowiedź została zainspirowana odpowiedzią Anamiki Modi . Dziękuję Ci!
źródło
Skorzystaj z dowolnej z poniższych opcji
groupby
iagg
przepisów.Aby agregować wiele kolumn jako listy, użyj dowolnej z następujących opcji:
Aby grupować listę tylko jednej kolumny, przekonwertuj groupby na
SeriesGroupBy
obiekt, a następnie wywołajSeriesGroupBy.agg
. Posługiwać się,źródło
groupby(..., sort=False)
. Tutaj nie miałoby to znaczenia, ponieważ grupuję według kolumny A, która jest już posortowana.df.groupby('a')['b'].agg(lambda x: list(set(x)))
Jeśli szukasz unikalnej listy podczas grupowania wielu kolumn, może to prawdopodobnie pomóc:
źródło
Użyjmy
df.groupby
razem z listą iSeries
konstruktoremźródło
Czas użyć
agg
zamiastapply
.Kiedy
Jeśli chcesz umieścić wiele kolumn na liście, wynik
pd.DataFrame
Jeśli chcesz pojedynczej kolumny na liście, wynik
ps.Series
Uwaga: wynik
pd.DataFrame
jest około 10 razy wolniejszy niż wynik,ps.Series
gdy agregujesz tylko jedną kolumnę, użyj jej w przypadku wielokolumn.źródło
Tutaj pogrupowałem elementy za pomocą „|” jako separator
źródło
Najłatwiejszy sposób, w jaki nie widziałem, pozwala osiągnąć większość tego samego co najmniej dla jednej kolumny, która jest podobna do odpowiedzi Anamiki tylko ze składnią krotki dla funkcji agregującej.
źródło