Pandas循环逐次打印单行结果,如何合并为列对齐的规整表格
问题根因
循环内每完成一次匹配就生成单行DataFrame直接打印的操作,会触发Pandas独立的逐次渲染逻辑:每轮重复输出表头、基于当前单行内容临时计算列宽、插入冗余分隔线,最终造成输出零散、列宽错位、格式混乱。
修正落地方案
整体逻辑核心为把“边匹配边打印”改成“全量匹配完统一渲染打印”,配合固定打印参数避免列宽错位,具体步骤:
- 放弃循环内的临时DataFrame打印逻辑,初始化一个空列表,每轮循环拿到匹配结果后直接存入列表,不做任何打印操作。
- 等所有目标名称遍历完成后,一次性把列表转换为完整的DataFrame,执行单次打印。
- 提前配置Pandas打印规则,解决中文字符列宽计算偏差导致的对齐问题。
常见问题代码示例
from rapidfuzz import process import pandas as pd # 待匹配的参考名称库 reference_names = ["北京朝阳实业有限公司", "北京海淀数字科技公司", "上海浦东进出口贸易商行"] # 需要做模糊匹配的目标名称列表 target_names = ["北京朝阳实业公可", "上海浦东贸易行", "北京海淀科技"] for target in target_names: match = process.extractOne(target, choices=reference_names, score_cutoff=50) # 问题核心:每轮循环生成单行df直接打印 temp_df = pd.DataFrame([{ "目标名称": target, "Matching": match[0], "Score": match[1] }]) print(temp_df)
修正后可直接运行的代码
from rapidfuzz import process import pandas as pd # 提前固定打印参数,解决中文列宽错位、重复渲染问题 pd.set_option("display.unicode.east_asian_width", True) # 适配中文宽度计算,避免列位歪掉 pd.set_option("display.width", 1200) # 固定整体表格渲染宽度 pd.set_option("display.max_colwidth", 30) # 固定单文本列最大宽度,避免长内容挤乱排版 # 待匹配的参考名称库 reference_names = ["北京朝阳实业有限公司", "北京海淀数字科技公司", "上海浦东进出口贸易商行"] # 需要做模糊匹配的目标名称列表 target_names = ["北京朝阳实业公可", "上海浦东贸易行", "北京海淀科技"] # 初始化空列表存储所有匹配结果 match_results = [] for target in target_names: match = process.extractOne(target, choices=reference_names, score_cutoff=50) if not match: match = (None, 0, None) # 只存结果,不中途打印 match_results.append({ "目标名称": target, "Matching": match[0], "Score": match[1] }) # 全量循环结束后,一次性生成完整表格并打印 final_output = pd.DataFrame(match_results) print(final_output)
排版保障注意事项
- 如果不开启
display.unicode.east_asian_width参数,哪怕是全量生成的DataFrame,中文场景下也会因为半角/全角字符宽度计算偏差,出现列文字对不齐的问题。 - 循环内绝对不要插入任何临时DataFrame的打印操作,多次触发Pandas的打印渲染逻辑必然会打断连续表格的格式。
- 对得分低于阈值的无效匹配,直接在存储结果时补默认值即可,不要单独打印无效行,避免破坏整体表格结构。
内容的提问来源于stack exchange,提问作者kittithep chantapatchanee
相关产品推荐
相关产品推荐

