You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
0234565600312345
1345600303100
254130400405432
3NaN
41231320130800199999

注意事项

上述代码默认Num2、Num3的非NaN值均为整数类float(即小数部分为0),如果你的实际数据存在小数部分不为0的情况,需要调整格式化规则适配需求。

内容的提问来源于stack exchange,提问作者casi_cielo32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:06:04