微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python pandas数据框上的条件总和被分组在多列上

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

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具有“ 5”和任何其他数字(即上表中标有*的行)时,我才需要通过将key1和key2分组来查找zdata和key3的平均值

所以理想的结果是

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

我确定一个lambda函数会到达此示例[Python Pandas Conditional Sums,但此问题在多列中分组

任何帮助将非常感激.

解决方法:

我认为最好将groupbymean用作agg,因为结果是DataFrame在列中没有Multiindex.然后,您可以将filterany和len一起使用,最后groupbymean一起使用:

#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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐