2013-06-23 16 views
11

Korzystanie z przykładowych danych:Python Pandy warunkowe Sumy

df = pd.DataFrame({'key1' : ['a','a','b','b','a'], 
       'key2' : ['one', 'two', 'one', 'two', 'one'], 
       'data1' : np.random.randn(5), 
       'data2' : np. random.randn(5)}) 

df

data1  data2  key1 key2 
0 0.361601 0.375297 a one 
1 0.069889 0.809772 a two 
2 1.468194 0.272929 b one 
3 -1.138458 0.865060 b two 
4 -0.268210 1.250340 a one 

Próbuję dowiedzieć się, jak grupa dane według key1 i ilości jedynie wartościami dane1 gdzie klucz2 równa " jeden'.

Oto co próbowałem

def f(d,a,b): 
    d.ix[d[a] == b, 'data1'].sum() 

df.groupby(['key1']).apply(f, a = 'key2', b = 'one').reset_index() 

Ale to daje mi dataframe z 'None' wartości

index key1 0 
0  a  None 
1  b  None 

tutaj jakieś pomysły? FYI

SELECT Key1, SUM(CASE WHEN Key2 = 'one' then data1 else 0 end) 
FROM df 
GROUP BY key1 

- Widziałem conditional sums for pandas aggregate ale nie może przekształcić odpowiedź przewidziany jest do pracy z sum zamiast powodów: szukam odpowiednika pandy następnego SQL.

góry dzięki

Odpowiedz

20

Pierwszy GroupBy kolumna klucz1:

In [11]: g = df.groupby('key1') 

a następnie dla każdej grupy podejmują subDataFrame gdzie klucz2 równa 'jeden' i podsumować kolumnę data1:

In [12]: g.apply(lambda x: x[x['key2'] == 'one']['data1'].sum()) 
Out[12]: 
key1 
a  0.093391 
b  1.468194 
dtype: float64 

Aby wyjaśnić, co się dzieje, spójrzmy na grupę "a":

In [21]: a = g.get_group('a') 

In [22]: a 
Out[22]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
1 0.069889 0.809772 a two 
4 -0.268210 1.250340 a one 

In [23]: a[a['key2'] == 'one'] 
Out[23]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
4 -0.268210 1.250340 a one 

In [24]: a[a['key2'] == 'one']['data1'] 
Out[24]: 
0 0.361601 
4 -0.268210 
Name: data1, dtype: float64 

In [25]: a[a['key2'] == 'one']['data1'].sum() 
Out[25]: 0.093391000000000002 

To może być nieco łatwiejsze/jaśniej to zrobić poprzez ograniczenie dataframe do tylko tych z Klawisz2 równa jeden pierwszy:

In [31]: df1 = df[df['key2'] == 'one'] 

In [32]: df1 
Out[32]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
2 1.468194 0.272929 b one 
4 -0.268210 1.250340 a one 

In [33]: df1.groupby('key1')['data1'].sum() 
Out[33]: 
key1 
a  0.093391 
b  1.468194 
Name: data1, dtype: float64 
+0

Awesome! Próbuję tego na moich rzeczywistych danych (może trochę potrwać), ale myślę, że właśnie tego szukałem. Wielkie dzięki – AllenQ

+0

Myślę, że możesz użyć tutaj nowego filtru Groupby ... – Jeff

+0

Po prostu przeszukaliśmy dokumentację i szybkie wyszukiwanie google ... nie mogłem dokładnie znaleźć tego, o co ci chodzi przez filtr groupby ... wskazujesz mi właściwy kierunek? – AllenQ

Powiązane problemy