如何并排对齐两个DataFrame各列Top3 value_counts结果校验数据异常
两DataFrame逐列Top3值计数并排对比实现方案
核心实现逻辑
先对两个DataFrame逐列计算Top3值计数,统一格式化后按列对齐组装成新的展示用DataFrame,保证列名、df1统计结果、df2统计结果三列完全对齐,每列统计占3行,列间留空分隔。
步骤1:导入依赖、编写通用统计函数
import pandas as pd def calc_col_top3(input_df: pd.DataFrame) -> dict: """逐列计算Top3值计数,返回格式为 {列名: [格式化后的计数结果1, 结果2, 结果3]}""" res = {} for col in input_df.columns: # 取单列Top3值计数,格式化为「值: 出现次数」 count_series = input_df[col].value_counts().head(3) res[col] = [f"{val}: {cnt}" for val, cnt in count_series.items()] # 不足3个值的列补空字符串,保证行对齐 while len(res[col]) < 3: res[col].append("") return res
步骤2:计算统计结果、组装展示表
# 分别计算两日数据的逐列Top3 df1_stats = calc_col_top3(df1) df2_stats = calc_col_top3(df2) # 按展示要求组装行数据 show_rows = [] for col_name in df1.columns: # 每列对应3行统计结果,仅第一行显示列名 for row_idx in range(3): show_rows.append({ "": col_name if row_idx == 0 else "", "df1": df1_stats[col_name][row_idx], "df2": df2_stats[col_name][row_idx] }) # 每列统计结束后加空行分隔 show_rows.append({"": "", "df1": "", "df2": ""}) # 生成最终展示表,隐藏索引 show_df = pd.DataFrame(show_rows) # 终端打印用这个 print(show_df.to_string(index=False)) # Jupyter/IPython环境下用下面的方法展示样式更美观 # from IPython.display import display # display(show_df.style.hide(axis="index"))
可选优化
- 如果需要展示值的占比辅助排查异常,可修改函数内的格式化字符串为
f"{val}: {cnt} 占比{cnt/len(input_df):.1%}" - 如果不需要列间空行,删掉组装行数据时追加空行的那行代码即可
- 如果要调整列展示顺序,修改show_rows里字典的key顺序就行
内容的提问来源于stack exchange,提问作者Ray92
相关产品推荐
相关产品推荐

