【发布时间】:2020-01-19 12:07:26
【问题描述】:
我有一个函数希望应用于 pandas DataFrame 的子集,以便在同一组的所有行(直到当前行)上计算该函数 - 即使用 groupby 然后 expanding .
例如,这个数据框:
df = pd.DataFrame.from_dict(
{
'group': ['A','A','A','B','B','B'],
'time': [1,2,3,1,2,3],
'x1': [10,40,30,100,200,300],
'x2': [1,0,1,2,0,3]
}).sort_values('time')
即
group time x1 x2
0 A 1 10 1
3 B 1 100 2
1 A 2 40 2
4 B 2 200 0
2 A 3 30 1
5 B 3 300 3
还有这个函数,例如:
def foo(_df):
return _df['x1'].max() * _df['x2'].iloc[-1]
[根据 jezrael 的反馈为清晰起见进行了编辑:我的实际功能更复杂,并且不能轻易地分解为该任务的组件。这个简单的函数只适用于 MCVE。]
我想做类似的事情:
df['foo_result'] = df.groupby('group').expanding().apply(foo, raw=False)
要获得这个结果:
group time x1 x2 foo_result
0 A 1 10 1 10
3 B 1 100 2 200
1 A 2 40 2 80
4 B 2 200 0 0
2 A 3 30 1 40
5 B 3 300 3 900
问题是,运行df.groupby('group').expanding().apply(foo, raw=False) 会导致KeyError: 'x1'。
是否有正确的方法来运行它,或者在pandas 中不将我的功能分解为组件就不可能这样做?
【问题讨论】:
-
_df['x2'].iloc[-1]是什么意思?x2的上一行值?从您的预期输出来看,它似乎不是这样(看起来您正在那里占据当前行......) -
.iloc[-1]是最后一行,不是上一行。