Pandas并排对齐两个DataFrame值计数结果输出格式异常
问题根因
当前输出是两个DataFrame的值计数结果被纵向拼接了,没有按字段名做索引对齐后横向排布,和部分列值计数条目不足3个没有关系。问题出在合并逻辑:大概率是调用pd.concat时没有指定axis=1参数,或是在把value_counts结果转成字符串列表的过程中丢失了字段名索引,导致两个数据集的结果上下堆叠到了一起。
修复方案
按如下逻辑实现即可得到按字段对齐的并排对比结果:
- 分别遍历两个DataFrame的所有列,生成统一格式的值计数汇总,以字段名作为索引
- 调用拼接方法时指定横向拼接,让pandas自动按字段名索引对齐两个数据集的结果
- 给两列结果命名区分来源数据集
可直接复用的代码:
import pandas as pd # 统一生成单DataFrame的值计数汇总 def gen_vc_report(df, top_n=3): vc_map = {} for col in df.columns: count_res = df[col].value_counts().head(top_n) vc_map[col] = [f"{val} - {cnt}" for val, cnt in count_res.items()] return pd.Series(vc_map, name=df.name) # 给两个目标DataFrame设置名称,用于最终列名区分 df_curr_obj.name = "df_curr_obj" df_old_obj.name = "df_old_obj" # 横向拼接,自动按字段名对齐 compare_result = pd.concat( [gen_vc_report(df_curr_obj), gen_vc_report(df_old_obj)], axis=1 ) # 打印查看结果 print(compare_result)
补充说明
- 如果需要展示更多Top N的值计数,直接修改
gen_vc_report函数的top_n参数即可,哪怕某列的值计数只有1条,pandas也会自动在对应缺失位置填充空值,不会再出现结果上下堆叠的问题 - 如果觉得列表形式的内容阅读不便,也可以把每个值计数条目拆成独立列,对比差异时更直观
内容的提问来源于stack exchange,提问作者Ray92
相关产品推荐
相关产品推荐

