python pandas 跨列的条件计数

python pandas conditional count across columns

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

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

我在搜索 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

我只是用一个平面数据框来做这件事,但它对面板来说是一样的。您可以采用以下两种方式之一。第一种方法就是您所做的,只需将 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