如何格式化DataFrame:为各列补trailing zeros实现数值位数统一
问题描述
我有如下DataFrame(所有值均为字符串类型):
| Col1 | Col2 | Col3 |
|---|---|---|
| -0.012 | 3.2 | nan |
| 0 | -1 | 15.2 |
| 0.5 | 7.53 | 76.88 |
需要通过添加末尾零,让每列的所有值保持相同的小数位数,预期结果如下:
| Col1 | Col2 | Col3 |
|---|---|---|
| -0.012 | 3.20 | nan |
| 0.000 | -1.00 | 15.20 |
| 0.500 | 7.53 | 76.88 |
解决方案
用Pandas可以实现这个需求,具体步骤和代码如下:
- 先把字符串列转换为数值类型,将字符串"nan"转为浮点型NaN;
- 统计每列非NaN值的小数位数最大值,作为该列的目标补零长度;
- 按目标长度格式化每个数值,补全末尾零,"nan"保持原样;
- 将结果转回字符串类型。
import pandas as pd # 初始化原始DataFrame df = pd.DataFrame({ 'Col1': ['-0.012', '0', '0.5'], 'Col2': ['3.2', '-1', '7.53'], 'Col3': ['nan', '15.2', '76.88'] }) def format_column(col): # 转换为数值,字符串"nan"转为NaN num_col = pd.to_numeric(col, errors='coerce') # 统计非NaN值的小数位数 decimal_lengths = [] for val in num_col.dropna(): if isinstance(val, int): decimal_lengths.append(0) else: decimal_part = str(val).split('.')[1] decimal_lengths.append(len(decimal_part)) if not decimal_lengths: return col # 全是nan的列直接返回原数据 max_decimals = max(decimal_lengths) # 格式化每一个值 formatted_list = [] for s in col: if s == 'nan': formatted_list.append('nan') else: num = float(s) formatted_list.append(f"{num:.{max_decimals}f}") return formatted_list # 对每一列应用格式化函数 for col_name in df.columns: df[col_name] = format_column(df[col_name]) print(df)
运行代码后即可得到预期的格式化结果。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

