【问题标题】:python pandas conditional count across columns跨列的python pandas条件计数
【发布时间】:2015-06-16 11:28:03
【问题描述】:

我有一个仅包含 1、0 和 -1 的数据框(称为 panel[xyz])。维度是:0:10 行和 a:j 列。

我想创建另一个具有相同垂直轴但只有 3 列的数据框 (df): col_1 = 计算所有非零值(1s 和 -1s) col_2 = 计数全 1 col_3 = 计数所有 -1s

我在搜索 SO 时发现了这个:

df[col_1] = (pan[xyz]['a','b','c','d','e'] > 0).count(axis=1)

...并尝试了许多不同的迭代,但我无法获得条件 (>0) 来区分 pan[xyz] 中的不同值。计数始终为 5。

任何帮助将不胜感激。

编辑:

平移[xyz] =

.	'a'	'b'	'c'	'd'	'e'	'f'	'g'	'h'	'i'	'j'
0	1	0	0	-1	0	0	-1	0	1	0
1	0	1	0	0	0	1	0	0	0	-1
2	1	0	0	0	0	-1	0	0	0	0
3	0	-1	0	0	0	0	0	1	0	0
4	0	0	0	1	0	0	-1	0	0	-1

df 应该是 =

.	col_1	col_2	col_3
0	4	2	2
1	3	2	1
2	2	1	1
3	2	1	1
4	3	1	2

但这就是我为 col_1 得到的:

df = (panel[xyz] > 0).count(axis=1)

df
Out[129]: 
0    10
1    10
2    10
3    10
4    10
dtype: int6

【问题讨论】:

  • 谢谢 JohnE,好建议。

标签: python pandas conditional dataframe vectorization


【解决方案1】:

我只是使用平面数据框执行此操作,但对于面板也是如此。您可以采用以下两种方式之一。第一种方式就是你做的,把count()改成sum()

( df > 0 ).sum(axis=1)

底层结构是布尔值,True 和 False 都被计算在内,而如果你将它们相加,它的解释更像你所期望的 (0/1)。

但更标准的做法是:

df[ df > 0 ].count(axis=1)

虽然前一种方法基于布尔数据框,但后者看起来像这样:

df[ df > 0 ]

    a   b   c   d   e   f   g   h   i   j
0   1 NaN NaN NaN NaN NaN NaN NaN   1 NaN
1 NaN   1 NaN NaN NaN   1 NaN NaN NaN NaN
2   1 NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN   1 NaN NaN
4 NaN NaN NaN   1 NaN NaN NaN NaN NaN NaN

在这种情况下,你使用哪种方法并不重要,但总的来说,后者会更好,因为你可以用它做更多的事情。例如,使用前一种方法(设计为具有二进制结果),您真正可以做的就是计数,但在后一种方法中,您可以计数、求和、乘法等。

对于df != 0 的情况,它的潜在用处可能更明显,其中有两个以上的可能值:

df[ df != 0 ]

    a   b   c   d   e   f   g   h   i   j
0   1 NaN NaN  -1 NaN NaN  -1 NaN   1 NaN
1 NaN   1 NaN NaN NaN   1 NaN NaN NaN  -1
2   1 NaN NaN NaN NaN  -1 NaN NaN NaN NaN
3 NaN  -1 NaN NaN NaN NaN NaN   1 NaN NaN
4 NaN NaN NaN   1 NaN NaN  -1 NaN NaN  -1

【讨论】:

  • 谢谢约翰,这正是我需要理解的。很好的解释。
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2021-02-09
  • 2020-06-12
相关资源
最近更新 更多