gpt4 book ai didi

python - 根据 Pandas 中的前后行计算一行中的值

转载 作者:行者123 更新时间:2023-12-04 17:18:27 28 4
gpt4 key购买 nike

我有以下数据框:

 p l w s_w  v
1 1 1 1 2
1 1 2 1 2
1 1 3 0 5
1 1 4 1 5
1 1 5 1 5
2 1 1 1 1
2 1 2 0 2
2 1 3 0 3
2 1 4 0 4
2 1 5 1 5
2 1 6 1 4

我想有一个新专栏如果 s_w 的值为 1,则在每一行中,它的值是前两行中的 sum(v) (不一定连续),其中 s_w==1和 sum(v) 对于接下来的两行(不一定是连续的),再次是 s_w==1 所以 sum(v) + sum(v)。

我对之间的任何数量的零不感兴趣

因此结果数据框如下所示:

 p l w s_w  v  c_s
1 1 1 1 2 Null
1 1 2 1 2 Null
1 1 3 0 5 Null
1 1 4 1 5 10
1 1 5 1 5 13
2 1 1 1 1 19
2 1 2 0 2 Null
2 1 3 0 3 Null
2 1 4 0 4 Null
2 1 5 1 5 Null
2 1 6 1 4 Null

最后两行的值会为Null,因为后面没有两个1(n 其他单词前后求和,只有前后两行有两个1(不一定连续,否则为Null)

对原始问题的新编辑:

对于每组 P,l 如果仅检查列中的值为 1,则在 s_w 列和前两行的 sum(v) 中找到上述模式,其中 s_w==1(不一定连续)并且求和(v) 以下两行,其中 s_w==1(不一定连续)

 p l w s_w check v
1 1 1 1 0 2
1 1 2 1 0 2
1 1 3 0 0 5
1 1 4 1 0 5
1 1 5 1 1 5
2 1 1 1 0 1
2 1 2 0 0 2
2 1 3 0 0 3
2 1 4 0 0 4
2 1 5 1 0 5
2 1 6 1 0 4

最佳答案

想法是用 1 过滤行,并使用 rolling sum 和移位值来正确对齐:

s = df.loc[df['s_w'].eq(1), 'v']

df['c_s'] = s.rolling(2).sum().shift().add(s.iloc[::-1].rolling(2).sum().shift())
print (df)
p l w s_w v c_s
0 1 1 1 1 2 NaN
1 1 1 2 1 2 NaN
2 1 1 3 0 5 NaN
3 1 1 4 1 5 10.0
4 1 1 5 1 5 13.0
5 2 1 1 1 1 19.0
6 2 1 2 0 2 NaN
7 2 1 3 0 3 NaN
8 2 1 4 0 4 NaN
9 2 1 5 1 5 NaN
10 2 1 6 1 4 NaN

另一个想法:

df['c_s'] = s.shift(-1).add(s.shift(-2)).add(s.shift(2)).add(s.shift(1))

编辑:

每组的解决方案:

s = df[df['s_w'].eq(1)]

f = lambda x: x.rolling(2).sum().shift()
df['c_s'] = s.groupby(['p','l'])['v'].apply(f).add(s.iloc[::-1].groupby(['p','l'])['v'].apply(f))

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))

关于python - 根据 Pandas 中的前后行计算一行中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67804103/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com