2013-07-03 22 views
32

Mam DataFrame z indeksem o nazwie city_id miast w formacie [city],[state] (np. new york,ny zawierające liczby całkowite w kolumnach.) Problem polega na tym, że mam wiele wierszy dla tego samego miasta, i chcę zwinąć wiersze dzielące city_id poprzez dodanie ich wartości kolumn Spojrzałem na groupby() ale to nie było oczywiste jak ją stosować do tego problemuŁączenie wierszy w pandach

Edycja:..

Przykład: chciałbym zmienić to:

city_id val1 val2 val3 
houston,tx 1 2 0 
houston,tx 0 0 1 
houston,tx 2 1 1 

w tym:

city_id val1 val2 val3 
houston,tx 3 3 2 

jeśli istnieją ~ 10-20k wierszy.

+6

To naprawdę nie jest duplikat, a odpowiedź @ DSM 'df.groupby (df.index)' nie pojawia się w zduplikowanym pytaniu. – LondonRob

Odpowiedz

41

Od

>>> df 
       val1 val2 val3 
city_id      
houston,tx  1  2  0 
houston,tx  0  0  1 
houston,tx  2  1  1 
somewhere,ew  4  3  7 

może zrobić

>>> df.groupby(df.index).sum() 
       val1 val2 val3 
city_id      
houston,tx  3  3  2 
somewhere,ew  4  3  7 

lub

>>> df.reset_index().groupby("city_id").sum() 
       val1 val2 val3 
city_id      
houston,tx  3  3  2 
somewhere,ew  4  3  7 

Pierwsze podejście przekazuje wartości wskaźnika (w tym przypadku, wartości city_id) do groupby i mówi, aby używał ich jako kluczy grupowych, a drugi resetuje indeks, a następnie wybiera kolumna city_id. Zobacz this section dokumentów, by zobaczyć więcej przykładów. Należy pamiętać, że istnieje wiele innych metod w DataFrameGroupBy obiektów, zbyt:

>>> df.groupby(df.index) 
<pandas.core.groupby.DataFrameGroupBy object at 0x1045a1790> 
>>> df.groupby(df.index).max() 
       val1 val2 val3 
city_id      
houston,tx  2  2  1 
somewhere,ew  4  3  7 
>>> df.groupby(df.index).mean() 
       val1 val2  val3 
city_id       
houston,tx  1  1 0.666667 
somewhere,ew  4  3 7.000000 
+0

Czy mimo to wybierasz wiersz, który ma średnią maksymalną w swojej grupie? W tym przykładzie powinien wybrać 'houston, tx 2 1 1' z pierwszej grupy. –

2

Coś w tym samym wierszu. Niestety nie jest to dokładna replika.

mydata = [{'subid' : 'B14-111', 'age': 75, 'fdg':1.78}, 
      {'subid' : 'B14-112', 'age': 22, 'fdg':1.56},{'subid' : 'B14-112', 'age': 40, 'fdg':2.00},] 
df = pandas.DataFrame(mydata) 

gg = df.groupby("subid",sort=True).sum() 
Powiązane problemy