Pandas条件列计数

时间:2017-01-04 01:21:56

标签: python pandas dataframe count

我有一个如下所示的数据框:

a1   |  a2  |  b3  |  b4  |  b5  |  c | d
 1   |   2  |   3  |  4   |   5  |  1 | 1 
 1   |   4  |   5  |  3   |   2  |  0 | 0
 2   |   3  |   1  |  1   |   0  |  0 | 0

我想创建两个列," a_count"和" b_count"。

对于" d"的每一行的值是1或" c"是0:

  • " A_COUNT"应代表次数' 1'出现在a1或 A2

  • " b_count"应代表次数' 1'出现在 B3 / B4 / B5

如果两者都是'和' c'是0它应该只是0。

所以结果输出看起来像......

a1   |  a2  |  b3  |  b4  |  b5  |  c  |     d     |  a_count  | b_count
 1   |   2  |   3  |  4   |   5  |  0  |     0     |     0     |    0
 1   |   4  |   5  |  3   |   2  |  1  |     0     |     1     |    0
 1   |   1  |   1  |  1   |   0  |  0  |     1     |     2     |    2

如果我分别计算a_count和b_count,那就没关系了。 我想我可以使用np.where等的组合,但我认为让我困惑的是弄清楚如何在列a1 / a2或b3 / b4 / b5中得到一个计数,其中各自的值为1且条件为c和d得到满足。

也许这是一个直截了当的问题,但我的大脑现在只是被炸了:(如果它太琐碎,有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

是的,np.where是解决此问题的不错选择。

df['a_count'] = np.where((df['c'] == 0) & (df['d'] == 0), 0, (df[['a1', 'a2']]==1).sum(1))
df['b_count'] = np.where((df['c'] == 0) & (df['d'] == 0), 0, (df[['b3', 'b4', 'b5']]==1).sum(1))

答案 1 :(得分:1)

anyone = df[['c', 'd']].eq(1).any(1)
df['a_count'] = df.filter(like='a').eq(1).sum(1) * anyone
df['b_count'] = df.filter(like='b').eq(1).sum(1) * anyone

print(df)

   a1  a2  b3  b4  b5  c  d  a_count  b_count
0   1   2   3   4   5  1  1        1        0
1   1   4   5   3   2  0  0        0        0
2   2   3   1   1   0  0  0        0        0

numpy获得相同的结果

anyone = (df[['c', 'd']].values == 1).any(1)
df['a_count'] = (df.filter(like='a').values == 1).sum(1) * anyone
df['b_count'] = (df.filter(like='b').values == 1).sum(1) * anyone

print(df)