Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于多列条件跳过pandas中lambda shift滚动函数中的单元格_Python_Pandas - Fatal编程技术网

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