python - 向 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.
解决方案
这个怎么样:
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(这样你就可以得到玩家之前通过的通过日期)
推荐阅读
- slack-api - 为工作区中的所有用户获取令牌
- python - 部分解析后使用 argcomplete
- vue.js - 获取页面的当前标题并从嵌套组件更新并在 Vuejs 2 中更新
- reactjs - 如何在 FileReader.onload 中使用 toHaveBeenCalled()
- elasticsearch - 用于 StatefulSets 的 Google Kubernetes Engine 上的 ReadWriteMany 存储
- c# - 仅在 vs 代码中调试时出现 SQL 异常(在 Visual Studio 中工作)
- html - 将两个 div 放在另一个 div 上,并且仍然换行
- c# - WebClient 返回错误 500 - WebException 响应说:不支持的浏览器
- java - 在 Java 中过滤获取请求
- java - 在 Spring Boot 中从不调用 AuthenticationEntryPoint