python pandas跨列的条件计数

时间:2015-04-10 16:42:47

标签: python pandas conditional dataframe vectorization

我有一个只包含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

1 个答案:

答案 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