繁体   English   中英

根据另一个数据帧pandas的列中的值替换一个数据帧行中的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM