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,但此问题在多列中分组
任何帮助将非常感激.
解决方法:
我认为最好将groupby
与mean
用作agg,因为结果是DataFrame在列中没有Multiindex.然后,您可以将filter
与any
和len一起使用,最后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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。