将前导零添加到 pandas 数据帧中小于 5 位数字的邮政编码

Adding leading zeros to zipcodes that are less than 5 digits in pandas dataframe

提问人:pyphan 提问时间:11/10/2023 最后编辑:Maria Kpyphan 更新时间:11/10/2023 访问量:50

问:

我有一个 pandas 数据帧,其中包含一列邮政编码,我想在邮政编码中添加前导零,以便它们都有五位数字。

这是我使用的代码,它可以正确识别长度小于 5 位数字的值,但不添加前导零以使其长度为 5。它还会正确跳过带有空单元格的 5 位数字。这些值以浮点数的形式出现,因此我将它们转换为字符串。

这是我正在使用的代码:

df_tellall['zipcode'] = df_tellall['zipcode'].astype(str)
df_tellall['cleanzip'] = df_tellall['zipcode'].apply(lambda x: str(x).zfill(5)  if len(str(x))<5 else "")

但它不会添加前导零。

邮政编码 清洁拉链
67509
4759 4759

任何帮助将不胜感激。

python-3.x 熊猫 lambda

评论

0赞 Nick ODell 11/10/2023
邮政编码中是否有尾随空格?
0赞 Mark Ransom 11/10/2023
你确定是字符串类型吗?cleanzip
0赞 Nick 11/10/2023
为什么不将“正确”值复制到,以便将所有固定值都放在一列中?cleanzip

答:

1赞 Andrej Kesely 11/10/2023 #1

尝试:

# convert "zipcode" to string (if necessary):
df["zipcode"] = df["zipcode"].astype(str)

# cleanzip will become "" when length >= 5, otherwise fill it with leading zeros:
df["cleanzip"] = np.where(
    df["zipcode"].str.len() < 5, df["zipcode"].str.zfill(5), ""
)
print(df)

指纹:

  zipcode cleanzip
0   67509         
1    4759    04759

评论

0赞 mozway 11/10/2023
它怎么不工作?它应该。
0赞 mozway 11/10/2023
您确定原始数字是从整数转换而来的,而不是用空格填充的吗?和 之间有区别吗?df["zipcode"].str.len()df["zipcode"].str.strip().str.len()
1赞 pyphan 11/10/2023
所以它奏效了......但是,当文件发送到 Excel 中的 CSV 输出文件时,它会再次去掉前导零......不知道如何解决这个问题。对此的任何评论都会有所帮助。非常感谢!
0赞 Andrej Kesely 11/10/2023
@pyphan 这是 Excel 问题,请参阅例如:support.microsoft.com/en-us/office/...
0赞 pyphan 11/10/2023
非常感谢大家!爱SO。我希望有一种方法可以在 python 中覆盖它 - 我知道如何在 excel 中手动更正它。我还将尝试 xls 导出,看看结果是否相同。