首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找与使用pandas的其他行具有相同(月和日)值的行

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

Stack Overflow用户
提问于 2019-04-23 11:40:31
回答 2查看 147关注 0票数 2

假设您有2个pandas数据帧。

代码语言:javascript
复制
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。学生是有学生生日的df。任务是找出学生在生日那天上学的百分比。

为了解决这个问题,我像下面这样合并了数据帧。,并将日期和生日转换为日期时间变量。

代码语言:javascript
复制
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'])

然后,创建一个空列表,运行for循环以获取生日和日期相同的日期列表(仅以月和日为单位)。

代码语言:javascript
复制
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)

这最终会完成这项工作,但我在想是否有更好、更有效的方法来完成这项工作。任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-23 12:34:42

您可以使用:

代码语言:javascript
复制
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())

输出:

代码语言:javascript
复制
    0.3333333333333333
票数 1
EN

Stack Overflow用户

发布于 2019-04-23 12:40:34

一种选择是将日期解析为只使用月和日的格式,并在此基础上进行连接。或者为月创建一列,为日创建一列,并在这两个列上连接

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55803986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档