首页 > 解决方案 > 向 groupby 函数添加过滤器

问题描述

这是我的数据集:

Day    Player    Score
1        Andy      6
2        Boby      6
3        Andy      4
4        Carl      2
5        Andy      3

这是一个简化的示例,但基本上我想添加一个新列('last_pass_date'),当'Player' 得分> 5 时它会查找上一个索引。

我所拥有的是:

df['last_pass_date'] = df.groupby(['Player'])['Day'].shift(1)

但我不确定如何添加“分数”> 5 的附加过滤器。任何帮助将不胜感激。谢谢!

编辑:我的解决方案的输出是 [NaN,NaN,'1',NaN,'3'] 理想情况下它应该是 [NaN,NaN,'1',NaN,'1'] 因为第 3 行不满足 Score > 5.

标签: pythonpython-3.xpandas

解决方案


这个怎么样:

df = pd.DataFrame({"Day": [1, 2, 3, 4, 5],
                   "Player": ["Andy", "Boby", "Andy", "Carl", "Andy"],
                   "Score": [6, 6, 4, 2, 3],
                   })
df['last_pass_date'] = None
passed_indices = df["Score"] > 5
df.loc[passed_indices, 'last_pass_date'] = df.loc[passed_indices, 'Day']
df['last_pass_date'] = df.groupby("Player")['last_pass_date'].apply(
    lambda group: group.shift().ffill())
print(df)

产生:

   Day Player  Score  last_pass_date
0    1   Andy      6             NaN
1    2   Boby      6             NaN
2    3   Andy      4             1.0
3    4   Carl      2             NaN
4    5   Andy      3             1.0

这个想法是将 last_pass_date 设置为玩家通过的当前日期,然后为每个玩家向前填充该列。唯一需要的额外技巧是在向前填充按玩家分组的列之前移动 1(这样你就可以得到玩家之前通过的通过日期)


推荐阅读