基于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设为索引,方便后续对齐
接下来我们分两步完成统计和合并:
统计原始数据中每个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对齐基准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
相关产品推荐
相关产品推荐

