如何统计两个DataFrame中用户对应日期的条目出现次数?
高效解决百万级DataFrame用户日期匹配统计需求
刚好碰到过类似的大数据量匹配统计场景,用map确实容易踩用户ID不匹配、性能拉胯的坑,给你一套适合15万+行数据的高效方案,步骤清晰还能避免各种问题:
第一步:先统一日期格式(关键!)
首先得把两个DataFrame里的日期字符串转成datetime类型,不然字符串格式稍有差异(比如斜杠和横杠混用)就会匹配失败,而且后续的分组聚合也更高效:
import pandas as pd # 转换日期列类型,确保匹配精准 df1['Last_used'] = pd.to_datetime(df1['Last_used']) df2['occurrence'] = pd.to_datetime(df2['occurrence'])
第二步:预统计df2的用户每日出现次数
先对df2按「用户+日期」分组计数,提前算出每个用户每天的条目数,这一步是向量级操作,比循环快N倍:
# 统计每个用户每天的出现次数,生成中间结果 daily_occurrences = df2.groupby(['user', 'occurrence']).size().reset_index(name='occurrences_that_day')
第三步:合并df1和预统计结果
用merge做左连接,确保df1里的所有用户都能保留,即使df2里没有对应日期的记录(这时候次数会填充为0):
# 按用户和日期精准匹配,合并两个DataFrame result = df1.merge( daily_occurrences, left_on=['user', 'Last_used'], right_on=['user', 'occurrence'], how='left' ).drop(columns=['occurrence']) # 删掉多余的occurrence列 # 把空值填充为0,并转成整数类型 result['occurrences_that_day'] = result['occurrences_that_day'].fillna(0).astype(int)
用你的示例数据测试的结果
代入你给的示例数据后,最终的result就是你要的预期输出:
| user | Last_used | occurrences_that_day |
|---|---|---|
| user1 | 2017-10-07 | 2 |
| user2 | 2018-10-20 | 1 |
| user3 | 2015-01-12 | 1 |
为啥这个方案比map靠谱?
- 性能拉满:
groupby和merge都是pandas底层优化过的操作,处理15万+行数据完全没压力,比循环或map快几个数量级 - 避免ID不匹配问题:左连接会完整保留df1的所有用户,不会因为df2里没有该用户就丢失数据,缺失的次数自动填0
- 日期匹配精准:转成
datetime类型后,不管原始字符串格式是啥,都能正确识别匹配,不会出现字符串不相等导致的统计错误
内容的提问来源于stack exchange,提问作者Sam L
相关产品推荐
相关产品推荐

