如何将Pandas DataFrame按不同列宽保存为固定格式?
解决方案:自定义字符串格式化实现固定列宽输出
要实现你需要的固定列宽格式,我们可以通过自定义每行的字符串格式化来精准控制每列的宽度和对齐方式,具体步骤如下:
1. 构造示例DataFrame
首先先还原你提供的DataFrame:
import pandas as pd # 构造示例数据 data = {"A": [1, 2], "B": [10, 20], "C": [1234, 0]} df = pd.DataFrame(data)
2. 定义行格式化函数
我们需要针对每一行,按照你要求的规则生成格式化后的字符串:
- 列A:数值占1位(右对齐),后跟逗号
- 列B:数值占4位(右对齐,不足补空格),后跟逗号
- 列C:数值占5位(右对齐,不足补空格)
对应的格式化函数可以这样写:
def format_row(row): # 使用f-string实现精准格式化::Nd表示右对齐,占N位宽度 part_a = f"{row['A']:1d}," part_b = f"{row['B']:4d}," part_c = f"{row['C']:5d}" return "".join([part_a, part_b, part_c])
3. 应用格式化并输出/保存
将函数应用到DataFrame的每一行,然后可以直接打印结果或者保存到文件:
# 生成所有格式化后的行 formatted_rows = df.apply(format_row, axis=1).tolist() # 打印结果 for line in formatted_rows: print(line) # 如果要保存到文件 with open("fixed_width_output.txt", "w") as f: f.write("\n".join(formatted_rows))
输出结果
运行上述代码后,你会得到如下输出:
1, 10, 1234 2, 20, 0
调整以匹配你的预期
如果你希望列B的数值部分显示为 10(6位宽度)、列C显示为 1234(6位宽度),只需要修改格式化字符串中的宽度参数即可,比如把列B的4d改成6d,列C的5d改成7d:
def format_row(row): part_a = f"{row['A']:1d}," part_b = f"{row['B']:6d}," part_c = f"{row['C']:7d}" return "".join([part_a, part_b, part_c])
这样就能得到你示例中的格式:
1, 10, 1234 2, 20, 0
关键说明
- 使用
f-string的Nd格式符可以轻松实现右对齐的固定宽度,如果需要左对齐可以用-Nd(比如{row['B']:-4d}) - 这种方法比Pandas内置的
to_csv更灵活,因为to_csv主要针对分隔符格式,难以精准控制固定列宽的细节
内容的提问来源于stack exchange,提问作者Javier Bhardt
相关产品推荐
相关产品推荐

