python - Python DataFrame:根据另一个df的条件更改df中一行的状态?
问题描述
我有两个df,一个带有记录students details
,另一个带有students attendance
记录。
详细信息_df
name roll start_day last_day
0 anthony 9 2020-09-08 2020-09-28
1 paul 6 2020-09-01 2020-09-15
2 marcus 10 2020-08-08 2020-09-08
出勤_df
name roll status day
0 anthony 9 absent 2020-07-25
1 anthony 9 present 2020-09-15
2 anthony 9 absent 2020-09-25
3 paul 6 present 2020-09-02
4 marcus 10 present 2020-07-01
5 marcus 10 present 2020-08-17
我试图status=absent
为start_day and last_day
.
例如:用户 -在总记录中,在 start_day 和 last_day 之间anthony
有两条记录。从这两条记录中,如果然后将该用户标记为 Trueattendance_df
3
status=absent
预期产出
name roll absent
0 anthony 9 True
1 paul 6 False
2 marcus 10 False
我曾尝试将 details_df 制作成一个列表,然后循环到 admission_df。但是还有其他有效的方法吗?
解决方案
您需要执行merge
(即连接操作)并过滤列day
在start_day
和之间的天数last_day
。然后,一个group-by + apply(即分组聚合操作):
merged_df = attendance_df.merge(details_df, on=['name', 'roll'])
df = (merged_df[merged_df.day.between(merged_df.start_day, merged_df.last_day)]
.groupby(['name', 'roll'])
.apply(lambda x: (x.status == 'absent').any())
.reset_index())
df.columns = ['name', 'roll', 'absent']
要得到:
df
name roll absent
0 anthony 9 True
1 marcus 10 False
2 paul 6 False
推荐阅读
- return-value - 来自合约的合约调用失败(在 VM 中成功)
- javascript - 在反应服务器渲染中未定义窗口
- android - 如何从我的应用分享视频到微信?
- python - 使用 Python 从文本文件创建 excel 以将交替行作为列标题和值
- javascript - IONIC Cordova 检索 InAppBrowser URL
- javascript - WebForm 日期字段
- javascript - 以一种方法处理多个表单输入
- python - Python字符串格式化指数输出
- javascript - 最后刻度标签未出现在 D3 折线图中
- reactjs - 材质 UI 抽屉溢出导致正文滚动条