两列分组数据帧上的移位滚动移动平均

2024-06-16 12:59:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想groupby在'A'和'B'中使用相同值的两列,并根据该值所在的列生成shift().rolling()

df

   s  A  B  ValueA  ValueB
0  1  b  a       1       3
1  1  c  a       2       2
2  0  a  b       2       4
3  0  c  b       1       3
4  0  a  c       2       1
5  0  c  a       4       2
6  0  b  a       7       4
7  0  c  b       1       5

现在,如果值在列“a”中考虑Valueto ^ {CD2>},如果该值在列“B”中,则考虑ValueB到^ {CD2>}/P>

我尝试了此代码,但结果不正确

代码

from numpy.core.numeric import NaN

df = pd.DataFrame({
    's' : [1,1,0,0,0,0,0,0],
    'A' : ['b','c','a','c','a','c','b','c'],
    'B': ['a', 'a', 'b', 'b','c','a','a','b'],
    'ValueA':[1,2,2,1,2,4,7,1],
    'ValueB':[3,2,4,3,1,2,4,5]
})
print(df)

df[['sumA','sumB']] = df.groupby(['A','B'])[['ValueA','ValueB']].shift().rolling(2, min_periods=2).sum()
print(df)


预期产量


  ValueA    ValueB
0   NaN     NaN
1   NaN     NaN
2   NaN     NaN
3   NaN     NaN
4   NaN     NaN
5   2.0     4.0
6   7.0     4.0
7   5.0     10.0

Tags: 代码fromcorenumpydfshiftnanprint
1条回答
网友
1楼 · 发布于 2024-06-16 12:59:18

我尝试了非循环版本,但是shift没有保留组分区

(基于this答案)

output_df = pd.DataFrame()
for _, grp in df[['ValueA','ValueB']].stack().groupby(df[['A','B']].stack().tolist()):
    sub_df = grp.shift().rolling(2, min_periods=2).sum().unstack()
    output_df = output_df.combine_first(sub_df)
output_df

产出:

|    |   ValueA |   ValueB |
| -:|    -:|    -:|
|  0 |      nan |      nan |
|  1 |      nan |      nan |
|  2 |        5 |      nan |
|  3 |      nan |        5 |
|  4 |        4 |        3 |
|  5 |        2 |        4 |
|  6 |        7 |        4 |
|  7 |        5 |       10 |

相关问题 更多 >