如何用Pandas仅为混合数据列中的整数补前导零?
问题描述
我有一个包含混合数据类型列的CSV文件,用Python Pandas处理时,原本用以下代码给列补前导零:
df = pd.read_csv('test.csv') df['column_A'] = df['column_A'].str.zfill(10)
但需求是仅为纯整数且长度不足10位的单元格补零,目前代码会错误处理含-的单元格(比如示例第5行)。示例数据及预期/实际结果如下:
| Raw Data | Ideal Outcome | Actual Outcome |
|---|---|---|
| ABC-1234 | ABC-1234 | ABC-1234 |
| 000-1234-000 | 000-1234-000 | 000-1234-000 |
| 1234 | 0000001234 | 0000001234 |
| 1234567890123 | 1234567890123 | 1234567890123 |
| 00-18 | 00-18 | 00000000-18 |
解决方案
核心思路是先筛选出纯整数类型的单元格,再对其中长度不足10位的补前导零,其余单元格保持原样。可以用正则匹配结合条件赋值实现:
方法1:使用np.where
import pandas as pd import numpy as np df = pd.read_csv('test.csv') # 匹配纯整数的正则:^开头、\d+匹配1个以上数字、$结尾 is_integer = df['column_A'].str.match(r'^\d+$') # 对符合条件且长度<10的单元格补零,否则保留原内容 df['column_A'] = np.where( is_integer & (df['column_A'].str.len() < 10), df['column_A'].str.zfill(10), df['column_A'] )
方法2:使用df.loc直接赋值
import pandas as pd df = pd.read_csv('test.csv') # 定位纯整数且长度不足10的行 mask = df['column_A'].str.match(r'^\d+$') & (df['column_A'].str.len() < 10) # 仅对这些行补零 df.loc[mask, 'column_A'] = df.loc[mask, 'column_A'].str.zfill(10)
验证结果
处理后的数据会完全符合预期:
- 纯整数且长度<10的单元格(如
1234)被补为0000001234 - 含非数字字符的单元格(如
ABC-1234、00-18)保持不变 - 长度≥10的纯整数(如
1234567890123)也保持原样
内容的提问来源于stack exchange,提问作者Archelrex
相关产品推荐
相关产品推荐

