python pandas数据帧的条件求和,它在多列

时间:2016-04-17 06:38:32

标签: python pandas dataframe

为了说明我的问题,我有一个示例数据框

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]})

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

我现在需要通过对key3和key2进行分组来找到zdata和key3的均值,其中key3具有'5'和任何其他数字(即上表中标有*的行)

所以期望的结果是

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

我确定lambda函数会像这个例子[Python Pandas Conditional Sums那样到达那里但是这个问题被分组在多个列上

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我认为最好使用groupby mean作为agg,因为结果为DataFrame,列中没有Multiindex。然后,您可以将filteranylen一起使用,将groupby再次与mean一起使用:

#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