我有一个如下所示的数据框:
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得到满足。
也许这是一个直截了当的问题,但我的大脑现在只是被炸了:(如果它太琐碎,有人能指出我正确的方向吗?
答案 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)