Python 如何基于多列条件跳过pandas中lambda shift滚动函数中的单元格
我有以下数据框,它是一个不同时间的列表:Python 如何基于多列条件跳过pandas中lambda shift滚动函数中的单元格,python,pandas,Python,Pandas,我有以下数据框,它是一个不同时间的列表: Name Time Excuse Injured Margin John 15 nan 0 1 John 18 nan 0 5 John 30 leg injury 1 11 John 16 nan
Name Time Excuse Injured Margin
John 15 nan 0 1
John 18 nan 0 5
John 30 leg injury 1 11
John 16 nan 0 4
John 40 nan 0 18
John 15 nan 0 3
John 22 nan 0 6
然后,我使用一个函数来获得前5次移位的平均值:
df['last5'] = df.groupby(['Name']).Time.apply(
lambda x: x.shift().rolling(5, min_periods=1).mean().fillna(.5))
这是可行的,但我希望执行相同的计算,但如果存在借口
,受伤=1
或边距>10
,我希望忽略时间
我的预期产出是:
Name Time Excuse Injured Margin last5
John 15 0 1 .5
John 18 0 5 15
John 30 leg injury 1 11 16.5
John 16 0 4 16.5
John 40 0 18 16.33
John 15 0 3 16.33
John 22 0 6 16
我可以在原始函数的末尾添加一个条件吗?提前谢谢
rolling
计算之前,可以根据条件过滤数据帧bfill()
向后填充NaN
值:df['last5']=(df[(df['preference'].isnull())&(df['Injured']!=1)&(df['Margin']谢谢David,这看起来很棒。我认为我唯一的问题是bfill()
函数。我有一个不同名字的列表,所以有没有办法按名字来排序bfill
吗?这会像df['last5']=df['last5'].groupby吗(['Name'].bfill()
?或者更确切地说是df['last5']=df.groupby(['Name'])['last5'].bfill()
@SOK是的,很好。你应该使用df['last5']=df.groupby(['Name'])['last5'].bfill()
。我已经更新了我的答案。
df['last5'] = (df[(df['Excuse'].isnull()) & (df['Injured'] != 1) & (df['Margin'] <= 10)]
.groupby(['Name']).Time.apply(lambda x: x.shift().rolling(5, min_periods=1)
.mean().fillna(.5)))
df['last5'] = df.groupby(['Name'])['last5'].bfill()
df
Out[1]:
Name Time Excuse Injured Margin last5
0 John 15 NaN 0 1 0.500000
1 John 18 NaN 0 5 15.000000
2 John 30 leg injury 1 11 16.500000
3 John 16 NaN 0 4 16.500000
4 John 40 NaN 0 18 16.333333
5 John 15 NaN 0 3 16.333333
6 John 22 NaN 0 6 16.000000