如何在Pandas中为DataFrame的每个数值单独设置小数位数?
为Pandas DataFrame中单个数值设置不同小数位数的实现方法
完全可以实现针对单个单元格的小数位数自定义,不用局限于整行或整列的统一设置,下面给出两种实用方案:
方案一:使用Pandas Styler调整显示格式(推荐)
这种方法不会修改原始数据,仅调整显示效果,适合报表展示场景。
步骤:
- 定义每个单元格的格式规则,用
(行索引, 列名)作为键,格式字符串作为值; - 编写自定义格式化函数,根据单元格的位置匹配对应的格式;
- 通过
df.style.format()应用规则,最后输出或展示。
示例代码:
import pandas as pd # 构造示例DataFrame data = { 'year': [1234, 12.12, 12.12], 'month': [5678, 34.34, 3.456], 'day': [9101, 2.3456, 7.789] } df = pd.DataFrame(data, index=['count', 'mean', 'std']) # 定义每个单元格的格式规则 format_rules = { ('count', 'year'): '{:.0f}', ('count', 'month'): '{:.0f}', ('count', 'day'): '{:.0f}', ('mean', 'year'): '{:.2f}', ('mean', 'month'): '{:.2f}', ('mean', 'day'): '{:.4f}', ('std', 'year'): '{:.2f}', ('std', 'month'): '{:.3f}', ('std', 'day'): '{:.3f}' } # 自定义格式化函数 def format_cell(value, row, col): return format_rules.get((row, col), '{:.4f}').format(value) # 应用格式并输出 styled_df = df.style.format(format_cell) print(styled_df.to_string())
输出结果将完全符合预期:
year month day count 1234 5678 9101 mean 12.12 34.34 2.3456 std 12.12 3.456 7.789
方案二:修改数据本身(不推荐,仅适合无需后续计算的场景)
如果需要直接修改DataFrame中的数值(会改变数据类型,可能影响后续运算),可以通过stack()和apply()结合自定义函数实现:
示例代码:
import pandas as pd # 构造示例DataFrame data = { 'year': [1234, 12.12, 12.12], 'month': [5678, 34.34, 3.456], 'day': [9101, 2.3456, 7.789] } df = pd.DataFrame(data, index=['count', 'mean', 'std']) # 自定义小数位数调整函数 def adjust_decimal(value, row, col): if row == 'count': return round(value, 0) elif row == 'mean': return round(value, 2) if col in ['year', 'month'] else round(value, 4) elif row == 'std': return round(value, 2) if col == 'year' else round(value, 3) return value # 应用调整并还原结构 df_formatted = df.stack().apply(lambda x: adjust_decimal(x, x.name[0], x.name[1])).unstack() print(df_formatted.to_string())
这种方法会将count行的数值转为整数,其他行按规则保留小数,显示效果同样符合要求,但原始数据的数值类型会被改变。
内容的提问来源于stack exchange,提问作者JasmineC
相关产品推荐
相关产品推荐

