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

Pandas实现DataFrame分组计数匹配添加到另一DataFrame对应行

解答

不需要创建数据库表执行SQL查询,Pandas内置方法完全可以高效实现这个需求,以下是可直接复现的实现方案:

首先构造描述中的两份测试数据:

import pandas as pd

# 初始化df1
df1 = pd.DataFrame({
    'Road': ['A', 'A', 'B', 'B'],
    'RoadNo': [1, 2, 1, 2],
    'Count': [0]*4
})

# 初始化df2
df2 = pd.DataFrame({
    'Road': ['A']*5 + ['B'],
    'RoadNo': [1,1,1,2,2,1]
})

推荐实现:分组计数+索引映射(性能最优)

核心逻辑是先对df2按匹配键分组统计行数,再通过索引映射直接更新df1的Count列,无匹配的组合自动保留初始0值:

# 统计df2中各Road+RoadNo组合的记录数
count_res = df2.groupby(['Road', 'RoadNo']).size()
# 按双键映射更新Count列,空值填0并转整数
df1['Count'] = df1.set_index(['Road', 'RoadNo']).index.map(count_res).fillna(0).astype(int)

执行后输出的df1完全符合预期:

  • Road=A、RoadNo=1 → Count=3
  • Road=A、RoadNo=2 → Count=2
  • Road=B、RoadNo=1 → Count=1
  • Road=B、RoadNo=2 → Count=0

备选实现:左连接合并(逻辑更易读)

如果更熟悉表连接逻辑,可以用左连接的方式实现,效果完全一致:

# 先统计df2的分组计数
df2_stat = df2.groupby(['Road', 'RoadNo'], as_index=False).agg(count_temp=('Road', 'count'))
# 以df1为基准左连接统计结果
df1 = df1.merge(df2_stat, on=['Road', 'RoadNo'], how='left')
# 更新Count列、清理临时字段
df1['Count'] = df1['count_temp'].fillna(0).astype(int)
df1.drop(columns='count_temp', inplace=True)

两种方法都只用到Pandas原生的groupby、map/merge内置函数,不需要依赖任何外部组件,处理百万级以内的数据性能都足够好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:09:26