python - 按组滚动总和
问题描述
考虑这个简单的例子
df = pd.DataFrame({'date' : [pd.to_datetime('2018-01-01'),
pd.to_datetime('2018-01-01'),
pd.to_datetime('2018-01-01'),
pd.to_datetime('2018-01-01')],
'group' : ['a','a','b','b'],
'value' : [1,2,3,4],
'value_useless' : [2,2,2,2]})
df
Out[78]:
date group value value_useless
0 2018-01-01 a 1 2
1 2018-01-01 a 2 2
2 2018-01-01 b 3 2
3 2018-01-01 b 4 2
在这里,我想value
按组计算滚动总和。我尝试简单的
df['rolling_sum'] = df.groupby('group').value.rolling(2).sum()
TypeError: incompatible index of inserted column with frame index
的变体apply
似乎也不起作用
df['rolling_sum'] = df.groupby('group').apply(lambda x: x.value.rolling(2).sum())
TypeError: incompatible index of inserted column with frame index
我在这里想念什么?谢谢!
解决方案
这groupby
是添加一个妨碍您的索引级别。
rs = df.groupby('group').value.rolling(2).sum()
df.assign(rolling_sum=rs.reset_index(level=0, drop=True))
date group value value_useless rolling_sum
0 2018-01-01 a 1 2 NaN
1 2018-01-01 a 2 2 3.0
2 2018-01-01 b 3 2 NaN
3 2018-01-01 b 4 2 7.0
细节
rs
# Annoying Index Level
# |
# v
# group
# a 0 NaN
# 1 3.0
# b 2 NaN
# 3 7.0
# Name: value, dtype: float64
或者,您可以通过使用绕过添加的索引pd.concat
df.assign(rolling_sum=pd.concat(s.rolling(2).sum() for _, s in df.groupby('group').value))
date group value value_useless rolling_sum
0 2018-01-01 a 1 2 NaN
1 2018-01-01 a 2 2 3.0
2 2018-01-01 b 3 2 NaN
3 2018-01-01 b 4 2 7.0
推荐阅读
- javascript - 如何为现有对象设置通用吸气剂?
- c++ - 将指针数组传递给函数时出现分段错误
- python - (Python/Flask_SQLAlchemy) 无法使用“sqlite:////tmp/test.db”打开数据库文件
- angular - 在Angular中将下拉值传递给HttpGet api
- winapi - WS_POPUP 的特点是什么?
- vue.js - Vue:获取对元素或数据绑定的引用以更改其类?
- python - Opencensus - Python Notebooks 中的手动上下文传播
- postgresql-9.5 - postgres 社区版中的数据屏蔽
- java - 如何使用 java/kotlin 在 EPSON TM-T88IV 打印机中部分切纸
- javascript - 是否可以从 reactjs 向 expressjs 发送 post 请求并快速获取数据并使用 redux 将其发送回 reactjs?