将 groupby rolling sum 与原始 pandas DataFrame 合并
Recombine groupby rollling sum with original pandas DataFrame
我有一个 pandas DataFrame 的形式:
import pandas as pd
df = pd.DataFrame({
'a': [1,2,3,4,5,6],
'b': [0,1,0,1,0,1]
})
我想按 'b' 的值对数据进行分组并添加新列 'c',其中包含每个组的 'a' 的滚动总和,然后我想重新组合所有这些组返回到包含 'c' 列的未分组的 DataFrame 中。我已经达到:
for i, group in df.groupby('b'):
group['c'] = group.a.rolling(
window=2,
min_periods=1,
center=False
).sum()
但是这种方法存在几个问题:
使用for循环对每个组进行操作感觉对于大型DataFrame(就像我的实际数据)来说会很慢
我找不到一种优雅的方法来为每个组保存列 'c' 并将其添加回原始 DataFrame。我可以将每个组的 c 附加到一个数组,用一个类似的索引数组压缩它,等等,但这看起来很老套。我在这里缺少内置的 pandas 方法吗?
如果必须使用 groupby
,那么您可以使用 groupby.apply
来一次性计算所有内容:
df['c'] = df.groupby('b')['a'].apply(lambda x: x.rolling(2, min_periods=1).sum())
从v0.19.1
开始,您可以直接调用groupby对象的rolling()/expanding()
方法,如下所示:
df['c'] = df.groupby('b').rolling(2, min_periods=1)['a'].sum().sortlevel(1).values
两者都给你:-
df
我有一个 pandas DataFrame 的形式:
import pandas as pd
df = pd.DataFrame({
'a': [1,2,3,4,5,6],
'b': [0,1,0,1,0,1]
})
我想按 'b' 的值对数据进行分组并添加新列 'c',其中包含每个组的 'a' 的滚动总和,然后我想重新组合所有这些组返回到包含 'c' 列的未分组的 DataFrame 中。我已经达到:
for i, group in df.groupby('b'):
group['c'] = group.a.rolling(
window=2,
min_periods=1,
center=False
).sum()
但是这种方法存在几个问题:
使用for循环对每个组进行操作感觉对于大型DataFrame(就像我的实际数据)来说会很慢
我找不到一种优雅的方法来为每个组保存列 'c' 并将其添加回原始 DataFrame。我可以将每个组的 c 附加到一个数组,用一个类似的索引数组压缩它,等等,但这看起来很老套。我在这里缺少内置的 pandas 方法吗?
如果必须使用 groupby
,那么您可以使用 groupby.apply
来一次性计算所有内容:
df['c'] = df.groupby('b')['a'].apply(lambda x: x.rolling(2, min_periods=1).sum())
从v0.19.1
开始,您可以直接调用groupby对象的rolling()/expanding()
方法,如下所示:
df['c'] = df.groupby('b').rolling(2, min_periods=1)['a'].sum().sortlevel(1).values
两者都给你:-
df