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
相关产品推荐
相关产品推荐

