pandas DataFrame含NaN的浮点列补前导零后拼接字段方法咨询
pandas 数值列补前导零后拼接实现方案
问题原因
你之前的两种写法均无法达到预期,核心问题如下:
- 待处理的Num2、Num3列为
float64类型,直接调用字符串专属方法zfill会触发报错 - 格式化时未先将float转成整数,会生成带小数点的字符串(比如
3.0格式化后变成003.0),长度不符合要求 - 你写的格式化占位符位数和需求不匹配:Num2要求总长度3位,你使用了
{:05}的占位符
实现代码
分步实现(可读性更高)
import pandas as pd # 处理Num1:转整数后转字符串,避免大整数被转为科学计数法 df['Num1_str'] = df['Num1'].apply(lambda x: str(int(x)) if pd.notnull(x) else x) # 处理Num2:转整数后补前导零到总长度3位 df['Num2_str'] = df['Num2'].apply(lambda x: f"{int(x):03d}" if pd.notnull(x) else x) # 处理Num3:转整数后补前导零到总长度5位 df['Num3_str'] = df['Num3'].apply(lambda x: f"{int(x):05d}" if pd.notnull(x) else x) # 三列拼接,任意一列为NaN则拼接结果保留NaN df['concat_result'] = df['Num1_str'] + df['Num2_str'] + df['Num3_str'] # 可选:删除中间生成的辅助列 df = df.drop(columns=['Num1_str', 'Num2_str', 'Num3_str'])
单行简洁实现
不需要生成中间辅助列,直接用行遍历完成所有逻辑:
import pandas as pd import numpy as np df['concat_result'] = df.apply( lambda row: f"{int(row['Num1'])}{int(row['Num2']):03d}{int(row['Num3']):05d}" if pd.notna(row[['Num1', 'Num2', 'Num3']]).all() else np.nan, axis=1 )
处理后效果参考
对应你给出的示例数据,最终拼接结果如下:
| 原始行索引 | concat_result |
|---|---|
| 0 | 234565600312345 |
| 1 | 345600303100 |
| 2 | 54130400405432 |
| 3 | NaN |
| 4 | 1231320130800199999 |
注意事项
上述代码默认Num2、Num3的非NaN值均为整数类float(即小数部分为0),如果你的实际数据存在小数部分不为0的情况,需要调整格式化规则适配需求。
内容的提问来源于stack exchange,提问作者casi_cielo32
相关产品推荐
相关产品推荐

