![](/img/trans.png)
[英]Pandas: replace values in one dataframe with values from another dataframe based on two columns
[英]replace values in the row of one dataframe based on the values in columns of another dataframe pandas
我有以下数据框 df1
sports_id school_id time activity_name
1 2 09:00-11:00 soccer match
3 1 08:00-09:00 soccer practice
5 2 08:00-11:00 baseball
并在包含学生 ID 和每个 12 月日期的数据框 df2 之后
student_id sports_id school_id 12-01-2018 12-02-2018 12-03-2018 12-04-2018
0001 5 2 08:00-11:00 Rest 08:00-11:00 08:00-09:00
0002 3 1 08:00-09:00 Rest 08:00-09:00 08:00-09:00
0003 1 2 09:00-11:00 Rest 09:00-11:00 09:00-10:00
基于 df1 中的sports_id、school_id 和时间,我想将 activity_name 映射到 df2 中的每个学生以获得以下数据帧。如果没有匹配,则保留数据帧中的现有值。结果数据帧将如下
student_id sports_id school_id 12-01-2018 12-02-2018 12-03-2018 12-04-2018
0001 5 2 baseball Rest baseball 08:00-09:00
0002 3 1 soccer practice Rest soccer practice soccer practice
0003 1 2 baseball Rest baseball 09:00-10:00
只是为了澄清,如果sports_id=5,school_id=2 并且时间是08:00-11:00,那么将df2 行中的值08:00-11:00 替换为“baseball”(如df1)由于组合sports_id =5,school_id=2 并且 time= 08:00-09:00 在 df1 中不存在,将时间 08:00-09:00 保留为 df2 中的日期 12-04-2018
简而言之,sports_id、school_id 和 time 是 3 个键,activity_name 是这 3 个键对应的值。
我正在尝试做这样的事情
df2.applymap(df1.set_index(['sports_id','school_id','time'])['activity_name'])
但它不起作用。
一个长度解决方案,改变df2的形状,再次合并和reshape。
new_df = df2.set_index(['student_id','sports_id','school_id']).stack().reset_index(name = 'time').merge(df1, how = 'outer')
new_df.activity_name.fillna(new_df.time, inplace=True)
new_df = new_df.drop('time', 1).set_index(['student_id','sports_id','school_id', 'level_3']).activity_name.unstack().reset_index()
new_df.columns.name = None
student_id sports_id school_id 12-01-2018 12-02-2018 12-03-2018 12-04-2018
0 1 5 2 baseball Rest baseball 08:00-09:00
1 2 3 1 soccer practice Rest soccer practice soccer practice
2 3 1 2 soccer match Rest soccer match 09:00-10:00
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.