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

如何统计两个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就是你要的预期输出:

userLast_usedoccurrences_that_day
user12017-10-072
user22018-10-201
user32015-01-121

为啥这个方案比map靠谱?

  • 性能拉满:groupby和merge都是pandas底层优化过的操作,处理15万+行数据完全没压力,比循环或map快几个数量级
  • 避免ID不匹配问题:左连接会完整保留df1的所有用户,不会因为df2里没有该用户就丢失数据,缺失的次数自动填0
  • 日期匹配精准:转成datetime类型后,不管原始字符串格式是啥,都能正确识别匹配,不会出现字符串不相等导致的统计错误

内容的提问来源于stack exchange,提问作者Sam L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:23:41