2016-04-17 17 views
3

gruppiert ist mein Problem zu veranschaulichen, ich habe ein Beispiel DatenrahmenPython Pandas bedingte Summe auf Datenrahmen, die auf mehrere Spalten

df = pd.DataFrame({'key1': [0, 0, 0, 0, 1, 1, 1, 1, 1, 1], 
        'key2': ['a', 'b', 'b', 'c', 'a', 'a', 'a', 'b', 'b', 'c'], 
        'key3': [10, 5, 15, 10, 5, 10, 20, 10, 20, 5], 
        'zdata': [2, 4, 2, 4, 3, 5, 6, 5, 5, 6]}) 

die, wenn sie

df1 = df.groupby(['key1', 'key2', 'key3']) 
df1 = df1.agg({'zdata' : [np.mean]}) 

   zdata 
       mean 
key1 key2 key3  
0 a 10  2 
    b 5  4 * (new group1) 
      15  2 * (new group1) 
    c 10  4 
1 a 5  3 * (new group2) 
      10  5 * (new group2) 
      20  6 * (new group2) 
    b 10  5 
      20  5 
    c 5  6 

produziert ich jetzt müssen den Mittelwert von zdata und key3 finden, indem key1 und key2 nur dann gruppiert werden, wenn key3 eine '5' und eine zusätzliche Zahl (d. h . die Zeilen mit einem * in der obigen Tabelle markiert)

So würden das gewünschte Ergebnis

   zdata 
       mean 
key1 key2 key3  
0 b 10  3 
1 a 11.6  4.6 

sein, die ich bin sicher, eine Lambda-Funktion wie in diesem Beispiel dort wird [Python Pandas Conditional Sums aber dieses Problem auf mehreren Spalten gruppiert

Jede Hilfe würde sehr geschätzt werden.

Antwort

3

ich besser denken ist groupby mit mean als agg zu verwenden, da Ergebnis ist DataFrame ohne Multiindex in Spalten. Dann können Sie filter mit any und len und letzten groupby mit mean wieder verwenden:

#instaed of agg use: 
df1 = df.groupby(['key1', 'key2', 'key3'], as_index=False)['zdata'].mean() 
print df1 
    key1 key2 key3 zdata 
0  0 a 10  2 
1  0 b  5  4 
2  0 b 15  2 
3  0 c 10  4 
4  1 a  5  3 
5  1 a 10  5 
6  1 a 20  6 
7  1 b 10  5 
8  1 b 20  5 
9  1 c  5  6 

#filter rows by conditions 
df2 = df1.groupby(['key1', 'key2']).filter(lambda x: (x.key3 == 5).any() & (len(x) > 1)) 
print df2 
    key1 key2 key3 zdata 
1  0 b  5  4 
2  0 b 15  2 
4  1 a  5  3 
5  1 a 10  5 
6  1 a 20  6 

print df2.groupby(['key1', 'key2'], as_index=False).mean() 
    key1 key2  key3  zdata 
0  0 b 10.000000 3.000000 
1  1 a 11.666667 4.666667 
Verwandte Themen