2016-10-25 12 views
8

W ramce danych o pandach można użyć funkcji do zgrupowania indeksu. Chciałbym zdefiniować funkcję, która zamiast tego jest stosowana do kolumny.Zastosuj funkcję do drugiej kolumny w grupie danych pandy o numerze

szukam do grupy przez dwie kolumny, z wyjątkiem muszę drugą kolumnę być pogrupowany według dowolnej funkcji, foo:

group_sum = df.groupby(['name', foo])['tickets'].sum() 

Jak foo być zdefiniowane grupy drugą kolumnę na dwie grupy , wyznaczone na przykład, czy wartości to > 0? Czy też zastosowano zupełnie inne podejście lub składnię?

Odpowiedz

6

GroupBy może przyjąć dowolną kombinację obu etykiet i serii/tablic (o ile tablica ma taką samą długość jak twój dataframe), więc można mapować funkcję do kolumny i przekazać go do GroupBy, jak

df.groupby(['name', df[1].map(foo)]) 

Alternatywnie możesz dodać warunek jako nową kolumnę do dataframe przed swój wykonać GroupBy, będzie to miało tę zaletę, nadając jej nazwę w indeksie:

df['>0'] = df[1] > 0 
group_sum = df.groupby(['name', '>0'])['tickets'].sum() 
2

coś takiego będzie działać:

x.groupby(['name', x['value']>0])['tickets'].sum() 

Jak wspomniano powyżej, groupby może przyjmować etykiety i serie. To powinno dać ci odpowiedź, której szukasz. Oto przykład:

data = np.array([[1, -1, 20], [1, 1, 50], [1, 1, 50], [2, 0, 100]]) 
x = pd.DataFrame(data, columns = ['name', 'value', 'value2']) 
x.groupby(['name', x['value']>0])['value2'].sum() 

name value 
1  False  20 
     True  100 
2  False 100 
Name: value2, dtype: int64 
Powiązane problemy