python - 根据其他列的值在 pandas 数据框中的列中查找模式
问题描述
在 key==1 的每一行中,我想在 s_w 列中搜索该行之前和之后出现的两次 1(其中 key==1),然后将这些行的 v 值求和并将其放入新列 X 中。这些 1 的出现不一定是连续的,在 s_w 列中的 is 之间可能存在间隙,例如 11....11 或 101....10001,但是如果我们之前在 s_w 列中都找不到两个 1或在该行之后(其中 key==1),然后我们将 NaN 放在 X 列中。对于 key==0 的行也是 NaN 。
编辑:一个新的数据框来测试解决方案是否可以很好地推广:
df = pd.DataFrame( { "p":[1,1,1,1,1,1,1,1,1,1,1,1,1],
"l" :[1,1,1,1,1,1,1,1,1,1,1,1,1],
"w":[1,2,3,4,5,6,7,8,9,10,11,12,12],
"s_w":[1,1,0,0,0,0,1,0,0,0,0,1,1],
"key" :[1,1,0,0,0,1,0,1,0,0,0,0,1],
"v":[2,2,5,3,4,5,5,1,2,3,4,5,4]
})
解决方案
我认为这里有必要仅通过Series.where
添加到先前的答案来添加掩码:
g = df[df['s_w'].eq(1)].groupby(['p','l'])['v']
df['c_s'] = g.shift(-1).add(g.shift(-2)).add(g.shift(2)).add(g.shift(1)).where(df['key'].eq(1))
print (df)
p l w s_w key v c_s
0 1 1 1 1 1 2 NaN
1 1 1 2 1 1 2 NaN
2 1 1 3 0 0 5 NaN
3 1 1 4 0 0 3 NaN
4 1 1 5 0 0 4 NaN
5 1 1 6 1 1 5 10.0 <- 2 + 2 + 5 + 1
6 1 1 7 1 0 5 NaN
7 1 1 8 1 1 1 19.0 <- 5 + 5 + 5 + 4
8 1 1 9 0 0 2 NaN
9 1 1 10 0 0 3 NaN
10 1 1 11 0 0 4 NaN
11 1 1 12 1 0 5 NaN
12 1 1 12 1 1 4 NaN