使用熊猫查找与其他行具有相同(月和日)值的行

时间:2019-04-23 03:40:31

标签: python-3.x pandas

假设您有2个熊猫数据框。

log = pd.DataFrame(
            {"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'],
             "student_id":[1, 2, 3, 4, 5, 6, 7, 8, 9]
            })
students = pd.DataFrame(
            {"date_of_birth":['1988-6-1', '1987-9-22', '1988-10-27', '1986-11-3', '1987-6-29', '1988-10-2', '1988-6-16', '1988-7-28', '1988-11-2'],
             "student_id":[1, 2, 3, 4, 5, 6, 7, 8, 9]
            })

log是出勤日期,出勤日期和学生ID。学生是有学生生日的df。 任务是找出在生日那天上学的学生百分比。

为解决此问题,我合并了如下数据框。并将日期和生日转换为日期时间变量

result = pd.merge(log, students,on='student_id')
result['date'] = pd.to_datetime(result['date'])
result['date_of_birth'] = pd.to_datetime(result['date_of_birth'])

然后,创建一个空列表,进行循环以获取生日和日期相同(仅在月份和日期中)的日期列表。

summary = []
for i in range(len(result)):
    if ((result['date'][i].day == result['date_of_birth'][i].day) and  
        (result['date'][i].month == result['date_of_birth'][i].month)):
        summary += [result['date'][i]]
    else: 
        pass 

len(summary)/len(result)

这最终可以完成工作,但是我在考虑是否有更好,更有效的方法来做到这一点。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以使用:

merged_df = log.merge(students, on='student_id')
merged_df['date'] = pd.to_datetime(merged_df['date'])
merged_df['date_of_birth'] = pd.to_datetime(merged_df['date_of_birth'])

print(((merged_df['date'].dt.month.eq(merged_df['date_of_birth'].dt.month))& (merged_df['date'].dt.day.eq(merged_df['date_of_birth'].dt.day))).mean())

输出:

    0.3333333333333333

答案 1 :(得分:1)

一种选择是将日期解析为仅使用月和日的格式,然后加入该格式。或为月份创建一列,为日期创建一列,然后将两者都加入

log['date'] = pd.to_datetime(log.date)
students['date_of_birth'] = pd.to_datetime(students.date_of_birth)

log['date_month_day'] = log.date.dt.strftime('%m-%d')
students['date_month_day'] = students.date_of_birth.dt.strftime('%m-%d')

result = pd.merge(log,students,how='inner',on=['date_month_day','student_id'])

print(len(result),len(students))