gpt4 book ai didi

python - 在具有多个条件的 Pandas 中复制 Countifs()

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:35 24 4
gpt4 key购买 nike

我有一个 DataFrame 的形式:

enter image description here

我想要实现的是一个 DataFrame,它具有唯一的组和 1-9 的每一列的非零计数。它看起来像下面这样。

enter image description here

我对此几乎不知所措。我看到了问题 here ,但这并没有解决分组方面的问题。我如何使用 Pandas 实现这一目标?

最佳答案

假设您有以下 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 速度较慢,但​​对于更大的数据集,差异并不大...

关于python - 在具有多个条件的 Pandas 中复制 Countifs(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com