You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:16