【发布时间】:2018-06-03 10:05:56
【问题描述】:
如何应用 DataFrame.rolling 函数并将值分配回原始 DataFrame?
例如,
i = pd.MultiIndex.from_product([['A','B','C'], np.arange(1, 11, 1)], names=['Name','Num'])
df = pd.DataFrame(np.random.randn(30), i, columns=['Vals'])
window = df.groupby(['Name']).rolling(3, min_periods=3)
df['Window'] = window['Vals'].apply(lambda x: x[1] + x[2])
在这种情况下,我希望使用每个 Name 值重置滚动 lambda,因此对于每个 Name 的前 3 行,Window 将是 NaN。但是,最后分配给 DataFrame 的新列会产生一列 完全 NaN
示例窗口 lambda 基本上可以正常工作,但我注意到它将分组值添加到 MultiIndex。请注意以下有两个级别称为Name:
window['Vals'].apply(lambda x: x[1] + x[2]) # Returns:
Name Name Num
A A 1 NaN
2 NaN
3 -2.408704
4 -3.184169
5 0.207093
6 1.649017
7 0.789064
8 0.706335
9 -0.487192
10 -1.625869
B B 1 NaN
2 NaN
3 0.023201
4 -0.044582
5 0.409526
我是否错误地使用了这些方法,或者没有做一些必要的事情来让window.apply() 与 DataFrame 对齐?
【问题讨论】:
-
你想用滚动功能做什么?
-
@cᴏʟᴅsᴘᴇᴇᴅ 前面
Vals的线性组合。 -
我了解您的问题。我会试试看能不能找到解决办法。
-
@cᴏʟᴅsᴘᴇᴇᴅ - 很酷,谢谢。请注意,我们可以在
df.groupby().rolling()...apply()的结果上调用index = index.droplevel()。但由于我不明白是否/何时/为什么添加额外级别,我担心将来会停止工作。 -
我没有解释为什么要处理额外的级别,但是您总是可以从结果中取出
.values并将其分配回去,没有任何问题。df['Window'] = window['Vals'].apply(lambda x: x[1] + x[2]).values.
标签: python pandas dataframe multi-index pandas-groupby