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

使用Python Pandas去除前导零且不改变列数据类型的方法

问题描述

我有一个约42000行、80列的CSV文件(分隔符为|),需要去除各列的前导零。用Pandas读取后直接保存,前导零虽已去除,但含空值的列被自动转为float类型,原本的整数(比如示例里的10)变成了10.0,求解决办法。

原文件示例

0000055|O|Price Rite Marketplace|361|1600 Memorial Dr|Chicopee|MA|010203933|Chicopee|25|013|USA|05|1|H|C|42.2001|-72.5731|A|250138113012012|||10
0000071|O|Big Es Supermarket|189|11 Union St|Easthampton|MA|010271417|Easthampton|25|015|USA|05|5|A|I|42.2697|-72.6717|A|250158224021037||
0000084|O|Big Y Supermarket|14|441 N Main St|East Longmeadow|MA|010281804|East Longmeadow|25|013|USA|05|5|G|C|42.0788|-72.5280|A|250138134012011|||15
0000101|O|Stop & Shop|95|440 Russell St|Hadley|MA|010359566|Hadley|25|015|USA|05|5|K|C|42.3644|-72.5382|A|250158214004004|||14
0000139|O|Key Food Marketplace|2508|13 Cabot St|Holyoke|MA|010406055|Holyoke|25|013|USA|05|5|A|C|42.1980|-72.6042|A|250138115002019|||06
0000149|O|Stop & Shop|9|28 Lincoln St|Holyoke|MA|010403472|Holyoke|25|013|USA|05|5|K|C|42.2150|-72.6172|A|250138118005012|||13

原操作代码

import pandas as pd
df = pd.read_csv(r"/home/ter/stest/cminxte1.txt", sep="|")
df.to_csv(r"/home/ter/stest/cminxte1.txt", sep='|', index=False)

输出问题示例

55|O|Price Rite Marketplace|361|1600 Memorial Dr|Chicopee|MA|10203933|Chicopee|25|13|USA|5|1|H|C|42.2001|-72.5731|A|250138113012012|||10.0
71|O|Big Es Supermarket|189|11 Union St|Easthampton|MA|10271417|Easthampton|25|15|USA|5|5|A|I|42.2697|-72.6717|A|250158224021037||
84|O|Big Y Supermarket|14|441 N Main St|East Longmeadow|MA|10281804|East Longmeadow|25|13|USA|5|5|G|C|42.0788|-72.528|A|250138134012011|||15.0
101|O|Stop & Shop|95|440 Russell St|Hadley|MA|10359566|Hadley|25|15|USA|5|5|K|C|42.3644|-72.5382|A|250158214004004|||14.0
139|O|Key Food Marketplace|2508|13 Cabot St|Holyoke|MA|10406055|Holyoke|25|13|USA|5|5|A|C|42.198|-72.6042|A|250138115002019|||6.0
149|O|Stop & Shop|9|28 Lincoln St|Holyoke|MA|10403472|Holyoke|25|13|USA|5|5|K|C|42.215|-72.6172|A|250138118005012|||13.0
解决方案

问题根源是:Pandas读取含空值的整数列时,会自动转成float类型(Python的int无法存储空值,float用NaN替代)。解决思路是从读取或处理阶段干预,同时保证前导零被去除。

方法一:全列按字符串读取,再统一去前导零

先把所有列按字符串加载,避免自动类型转换,再处理前导零:

import pandas as pd

# 读取时强制所有列为字符串类型
df = pd.read_csv(r"/home/ter/stest/cminxte1.txt", sep="|", dtype=str)

# 遍历列去除前导零,空值保持原样
for col in df.columns:
    df[col] = df[col].apply(lambda x: x.lstrip('0') if pd.notna(x) and x.strip() != '' else x)
    # 处理全零的情况(比如"0000"去零后为空,保留原内容或设为空值)
    df[col] = df[col].replace('', None)

# 保存时把空值转为空字符串,避免出现NaN
df.to_csv(r"/home/ter/stest/cminxte1.txt", sep='|', index=False, na_rep='')

方法二:读取后将float列转回整数格式

如果已经读取了文件,可针对float列做转换:

import pandas as pd

df = pd.read_csv(r"/home/ter/stest/cminxte1.txt", sep="|")

# 遍历所有float类型列,判断是否为整数型float(如10.0而非42.2001)
for col in df.columns:
    if df[col].dtype == 'float64':
        if pd.api.types.is_integer_dtype(df[col].dropna()):
            # 把非空值转成整数再转字符串,空值设为空字符串
            df[col] = df[col].apply(lambda x: str(int(x)) if pd.notna(x) else '')

df.to_csv(r"/home/ter/stest/cminxte1.txt", sep='|', index=False, na_rep='')

方法三:读取时用converters指定列处理

仅对需要去前导零的列做转换,效率更高:

import pandas as pd

# 定义去前导零的函数,空值返回空字符串
def strip_zeros(x):
    if x.strip() == '':
        return ''
    # 处理全零情况,避免转成空字符串
    return x.lstrip('0') if x.lstrip('0') != '' else x

# 读取时给所有列应用转换函数(也可指定具体列名列表)
df = pd.read_csv(r"/home/ter/stest/cminxte1.txt", sep="|", converters={col: strip_zeros for col in range(80)})

df.to_csv(r"/home/ter/stest/cminxte1.txt", sep='|', index=False, na_rep='')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:15:54