首页 > 解决方案 > 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=absentstart_day and last_day.

例如:用户 -在总记录中,在 start_day 和 last_day 之间anthony有两条记录。从这两条记录中,如果然后将该用户标记为 Trueattendance_df3status=absent

预期产出

        name          roll      absent
    0   anthony        9         True
    1   paul           6         False
    2   marcus        10         False

我曾尝试将 details_df 制作成一个列表,然后循环到 admission_df。但是还有其他有效的方法吗?

标签: pythonpandasnumpydataframedatetime

解决方案


您需要执行merge(即连接操作)并过滤列daystart_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


推荐阅读