熊猫:连续计算值

时间:2019-03-07 20:30:14

标签: python python-3.x pandas

例如,我有一个数字DataFrame:

x = np.array([[1,2,3],[-1,-1,1],[0,0,0]])
df = pd.DataFrame(x, columns=['A','B','C'])
df

   A  B  C
0  1  2  3
1 -1 -1  1
2  0  0  0

我想为每一行计数正值,负值和等于0的值。我一直在尝试以下方法:

df['positive_count'] = df.apply(lambda row: (row > 0).sum(), axis = 1)
df['negative_count'] = df.apply(lambda row: (row < 0).sum(), axis = 1)
df['zero_count'] = df.apply(lambda row: (row == 0).sum(), axis = 1)

但是我得到以下结果,这显然是不合法的

   A  B  C  positive_count  negative_count  zero_count
0  1  2  3               3               0           1
1 -1 -1  1               1               2           0
2  0  0  0               0               0           5

任何人都知道可能出了什么问题,或者可以帮助我找到最佳方法来完成我要寻找的事情?

谢谢。

1 个答案:

答案 0 :(得分:5)

有一些方法,但是一种选择是使用np.signget_dummies

u = (pd.get_dummies(np.sign(df.stack()))
       .sum(level=0)
       .rename({-1: 'negative_count', 1: 'positive_count', 0: 'zero_count'}, axis=1))
u

   negative_count  zero_count  positive_count
0               0           0               3
1               2           0               1
2               0           3               0

df = pd.concat([df, u], axis=1)
df

   A  B  C  negative_count  zero_count  positive_count
0  1  2  3               0           0               3
1 -1 -1  1               2           0               1
2  0  0  0               0           3               0

np.sign将零与正值和负值区别对待,因此在这里使用是理想的选择。


另一个选项是groupbyvalue_counts

(np.sign(df)
   .stack()
   .groupby(level=0)
   .value_counts()
   .unstack(1, fill_value=0)
   .rename({-1: 'negative_count', 1: 'positive_count', 0: 'zero_count'}, axis=1))

   negative_count  zero_count  positive_count
0               0           0               3
1               2           0               1
2               0           3               0

稍微冗长一些,但仍然值得了解。