使用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
相关产品推荐
相关产品推荐

