假设您有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)
这最终可以完成工作,但是我在考虑是否有更好,更有效的方法来做到这一点。 任何帮助将不胜感激!
答案 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))