我有一个只包含1,0和-1的数据帧(称为panel [xyz])。维度为:行0:10和列a:j。
我想创建另一个具有相同垂直轴但只有3列的数据帧(df): col_1 =计算所有非零值(1s和-1s) col_2 =计算所有1 col_3 = count all -1s
我在搜索SO时发现了这个:
df[col_1] = (pan[xyz]['a','b','c','d','e'] > 0).count(axis=1)
...并尝试了很多不同的迭代,但是我无法得到条件(> 0)来区分pan [xyz]中的不同值。计数总是= 5。
非常感谢任何帮助。
编辑:
pan [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
答案 0 :(得分:4)
我只是使用平面数据框执行此操作,但对于面板而言它是相同的。你可以用两种方法之一。第一种方式是您所做的,只需将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