Zaczynam od takich danych wejściowych jak to
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
Które po wydrukowaniu wygląda następująco:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
Grupowanie jest dość proste:
g1 = df1.groupby( [ "Name", "City"] ).count()
a drukowanie daje GroupBy
obiekt:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
Ale ostatecznie chcę innego obiektu DataFrame, który zawiera wszystkie wiersze w obiekcie GroupBy. Innymi słowy, chcę uzyskać następujący wynik:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
Nie widzę, jak to osiągnąć w dokumentacji pand. Wszelkie wskazówki byłyby mile widziane.
python
pandas
dataframe
pandas-groupby
multi-index
saveenr
źródło
źródło
Empty DataFrame
Columns: []
Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
Odpowiedzi:
g1
tutaj jest DataFrame. Ma jednak indeks hierarchiczny:Może chcesz coś takiego?
Lub coś takiego:
źródło
reset.index()
wykonuje robotę, świetnie!df1.groupby( [ "Name", "City"] ).size().to_frame(name = 'count').reset_index()
.reset_index()
wydaje mi się najlepszym sposobem dołączenia do wyjścia, z którego będziesz korzystaćdf.groupby('some_column').apply(your_custom_func)
. To nie było dla mnie intuicyjne.pandas.core.groupby.DataFrameGroupBy
obiekt, a niepandas.core.frame.DataFrame
.Chcę nieco zmienić odpowiedź udzieloną przez Wesa, ponieważ wymaga wersji 0.16.2
as_index=False
. Jeśli go nie ustawisz, otrzymasz pustą ramkę danych.Źródło :
EDYTOWAĆ:
W wersji
0.17.1
, a później można wykorzystaćsubset
wcount
ireset_index
z parametremname
wsize
:Różnica między
count
isize
polega na tym, żesize
zlicza wartości NaN, podczas gdycount
nie.źródło
df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
as_index=False' stopped working in latest versions? I also tried to run
df1.groupby ([„Nazwa”, „Miasto”], as_index = False) .size () `ale nie wpływa na wynik (prawdopodobnie dlatego, że wynik grupowaniaSeries
nie jestDataFrame
groupby
według tych kolumn. Ale nie jestem pewien, ponieważ nie jestem programistą pand.Po prostu powinno to wykonać zadanie:
Tutaj
grouped_df.size()
pobiera unikalną liczbę grup według liczby, areset_index()
metoda resetuje nazwę kolumny, którą chcesz, aby była. Na koniecDataframe()
wywoływana jest funkcja pandy w celu utworzenia obiektu DataFrame.źródło
Kluczem jest użycie metody reset_index () .
Posługiwać się:
Teraz masz nową ramkę danych w g1 :
źródło
Być może źle rozumiem pytanie, ale jeśli chcesz przekonwertować grupę z powrotem na ramkę danych, możesz użyć .to_frame (). Chciałem zresetować indeks, kiedy to zrobiłem, więc także tę część.
przykładowy kod niezwiązany z pytaniem
źródło
Odkryłem, że to działało dla mnie.
źródło
Poniższe rozwiązanie może być prostsze:
źródło
Połączyłem z mądrymi danymi i zapisałem w ramce danych
źródło
Te rozwiązania tylko częściowo działały dla mnie, ponieważ robiłem wiele agregacji. Oto przykładowe dane wyjściowe zgrupowane według tego, że chciałem przekonwertować na ramkę danych:
Ponieważ chciałem więcej niż liczba podana przez reset_index (), napisałem ręczną metodę konwersji powyższego obrazu w ramkę danych. Rozumiem, że nie jest to najbardziej pythonowy / pandowy sposób na zrobienie tego, ponieważ jest dość gadatliwy i wyraźny, ale to wszystko, czego potrzebowałem. Zasadniczo użyj opisanej powyżej metody reset_index (), aby uruchomić ramkę danych „rusztowania”, a następnie zapętlić pary par w zgrupowanej ramce danych, pobrać indeksy, wykonać obliczenia względem niezgrupowanej ramki danych i ustawić wartość w nowej zagregowanej ramce danych .
Jeśli słownik nie jest twoją rzeczą, obliczenia można zastosować bezpośrednio w pętli for:
źródło