Pandas Merge仅返回每个用户单条匹配结果技术求助
解决DataFrame合并仅返回特定日期记录的问题
看起来你遇到的问题很典型,我来帮你一步步排查和解决:
1. 先检查合并时的列名写法是否正确
你写的代码是:
all_dat = pd.merge(activity,fees,on=[id,year_month])
这里要注意:on参数需要传入列名的字符串,如果id和year_month没有被定义为存储列名的变量,那这行代码会把它们当成变量值来用,而不是列名。这可能直接导致合并逻辑出错,只匹配到了符合某个特定值的行。
正确的写法应该是给列名加上引号:
all_dat = pd.merge(activity, fees, on=['id', 'year_month'])
2. 排查datetime64类型字段的精度差异
这是最常见的原因:两个DataFrame里的year_month字段虽然看起来都是日期,但实际存储的精度可能不一样。比如一个是带时分秒的2017-01-01 08:30:00,另一个是纯日期的2017-01-01,这时候它们在合并时会被判定为不相等。
你可以先查看两个字段的实际值:
# 查看activity中year_month的前10条记录,包括时间精度 print(activity['year_month'].head(10)) # 查看fees中year_month的前10条记录 print(fees['year_month'].head(10))
如果发现精度不一致,统一转成纯日期格式(保留datetime类型):
# 去掉时分秒,只保留日期部分 activity['year_month'] = activity['year_month'].dt.floor('D') fees['year_month'] = fees['year_month'].dt.floor('D')
或者转成date类型:
activity['year_month'] = activity['year_month'].dt.date fees['year_month'] = fees['year_month'].dt.date
3. 检查ID字段的类型是否一致
如果两个DataFrame里的id字段类型不同(比如一个是整数int,一个是字符串str),也会导致大部分匹配失败,只留下少数碰巧类型一致的记录。
检查类型:
print("activity的id类型:", activity['id'].dtype) print("fees的id类型:", fees['id'].dtype)
如果不一致,统一转成相同类型,比如都转成字符串:
activity['id'] = activity['id'].astype(str) fees['id'] = fees['id'].astype(str)
4. 验证合并方式是否符合预期
默认的pd.merge是内连接(inner join),只会保留两个表中同时存在的id和year_month组合。如果你想确认是不是某些日期在其中一个表中缺失,可以先换成外连接看看:
all_dat = pd.merge(activity, fees, on=['id', 'year_month'], how='outer') # 查看哪些组合有缺失值 print(all_dat[all_dat.isna().any(axis=1)])
按照上面的步骤排查,应该就能解决你遇到的问题了。
内容的提问来源于stack exchange,提问作者Memduh
相关产品推荐
相关产品推荐

