我想要实现的是一个DataFrame,它具有唯一的组和每列1-9的非零数.它看起来像下面.
我对此非常不知所措.我看到了问题here,但这并未涉及分组方面.如何使用熊猫实现这一目标?
解决方法:
假设你有以下DF:
In [82]: df
Out[82]:
Group 1 2 3 4 5
0 Group1 0 1 4 0 1
1 Group1 3 0 4 1 5
2 Group2 0 1 4 3 6
3 Group2 5 1 4 0 7
4 Group3 0 0 4 7 8
5 Group3 7 1 4 7 9
解:
In [83]: df.set_index('Group').ne(0).groupby(level=0).sum().reset_index()
Out[83]:
Group 1 2 3 4 5
0 Group1 1.0 1.0 2.0 1.0 2.0
1 Group2 1.0 2.0 2.0 1.0 2.0
2 Group3 1.0 1.0 2.0 2.0 2.0
作为整数:
In [84]: df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index()
Out[84]:
Group 1 2 3 4 5
0 Group1 1 1 2 1 2
1 Group2 1 2 2 1 2
2 Group3 1 1 2 2 2
更新:
In [92]: df
Out[92]:
Group 1 2 3 4 5
0 Group1 0 1 4 0 0
1 Group1 3 0 4 1 0
2 Group2 0 1 4 3 0
3 Group2 5 1 4 0 0
4 Group3 0 0 4 7 0
5 Group3 7 1 4 7 0
In [93]: df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index()
Out[93]:
Group 1 2 3 4 5
0 Group1 1 1 2 1 0
1 Group2 1 2 2 1 0
2 Group3 1 1 2 2 0
定时:
In [37]: %timeit df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index()
100 loops, best of 3: 6.24 ms per loop
In [38]: %timeit df.pivot_table(index='Group', aggfunc=np.count_nonzero)
100 loops, best of 3: 19.2 ms per loop
让我们对更大的(60.000行)DF进行测试:
In [39]: df = pd.concat([df] * 10**4, ignore_index=True)
In [40]: df.shape
Out[40]: (60000, 6)
In [42]: %timeit df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index()
10 loops, best of 3: 22.4 ms per loop
In [43]: %timeit df.pivot_table(index='Group', aggfunc=np.count_nonzero)
10 loops, best of 3: 43 ms per loop
结论:
由于额外的开销,IMO高级函数pivot_table速度较慢,但对于更大的数据集而言差异并不大……
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。