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

基于Pandas实现DataFrame的Value Count统计与合并(保留未匹配行)

解决Pandas合并DataFrame并统计频次的问题

嗨,作为Python/Pandas新手遇到这种表格重塑的问题很正常,别担心,我们可以用Pandas的内置函数轻松解决,完全不需要复杂的循环!

步骤拆解与代码实现

首先,先把你的两个DataFrame用代码还原出来方便演示:

import pandas as pd

# 第一个包含原始数据的DataFrame
df_raw = pd.DataFrame({
    'var1': ['EA-0123', 'EC-0124', 'EC-0124', 'ED-0125', 'ED-0125'],
    'var2': ['A01', 'A03', 'A03', 'A02', 'A01']
})

# 第二个需要保留所有行的基准DataFrame
df_base = pd.DataFrame({
    'var1': ['EA-0123', 'EB-0124', 'EC-0124', 'ED-0125'],
    'A01': [0, 0, 0, 0],
    'A02': [0, 0, 0, 0],
    'A03': [0, 0, 0, 0]
}).set_index('var1')  # 将var1设为索引,方便后续对齐

接下来我们分两步完成统计和合并:

  1. 统计原始数据中每个var1对应var2的出现次数
    用pd.crosstab()可以直接生成宽格式的频次统计表,非常适合你的需求:

    # 生成频次表:行是var1,列是var2的取值,值是对应次数
    freq_table = pd.crosstab(df_raw['var1'], df_raw['var2'])
    

    这一步得到的freq_table会是这样的:

    var2    A01  A02  A03
    var1
    EA-0123    1    0    0
    EC-0124    0    0    2
    ED-0125    1    1    0
    
  2. 对齐基准DataFrame的行,保留所有原始行
    因为你的df_base包含EB-0124这种在原始数据中没有的行,我们用reindex()方法以df_base的索引为基准对齐频次表,缺失的行自动填充0:

    # 对齐索引并填充0,得到最终结果
    final_result = freq_table.reindex(df_base.index, fill_value=0)
    

    如果你需要和df_base的初始结构完全一致(比如保留原来的0列结构),也可以直接替换df_base的列值:

    df_base[final_result.columns] = final_result
    final_result = df_base.reset_index()  # 可选:把var1从索引变回普通列
    

最终得到的结果就是你想要的:

var1  A01  A02  A03
0  EA-0123    1    0    0
1  EB-0124    0    0    0
2  EC-0124    0    0    2
3  ED-0125    1    1    0

为什么不用循环?

Pandas的核心优势就是向量化操作,内置函数(比如crosstab、groupby)都是经过优化的,比手动写if-elif-else循环效率高得多,还能避免索引对齐、数据类型错误等容易踩的坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:45