如何用Pandas为包含正负值的列添加前导零?
给DataFrame列添加前导零(含负值)的解决办法
问题场景
原始value列数据:
value
-1
9
10
-2
期望处理后得到:
value
-01
09
10
-02
你尝试的zfill(2)之所以失效,是因为它会把负号计入总长度,导致负数的数字部分只能占1位,无法补零。
可行解决方案
方法1:拆分符号与数字拼接
先分离正负符号和绝对值,给绝对值补零后再拼接回去:
import pandas as pd df = pd.DataFrame({'value': [-1, 9, 10, -2]}) # 提取符号(负数留'-',正数留空) df['sign'] = df['value'].map(lambda x: '-' if x < 0 else '') # 对绝对值补前导零到2位 df['num'] = df['value'].abs().astype(str).str.zfill(2) # 合并符号和补零后的数字 df['value'] = df['sign'] + df['num'] # 清理中间列(可选) df = df.drop(['sign', 'num'], axis=1)
方法2:格式化字符串(最简洁)
利用Python的格式化语法,直接对正负值分别处理:
df['value'] = df['value'].apply(lambda x: f'-{abs(x):02d}' if x < 0 else f'{x:02d}')
这里{:02d}表示将数字格式化为2位,不足补前导零;负数先取绝对值格式化,再补上负号。
方法3:正则表达式替换
用正则匹配数字部分,单独给数字补零:
df['value'] = df['value'].astype(str).str.replace(r'(-?)(\d+)', lambda match: match.group(1) + match.group(2).zfill(2))
正则(-?)(\d+)会捕获可选的负号和后面的数字,再对数字部分执行zfill补零。
以上三种方法都能得到你想要的输出,其中方法2代码最简洁,适合快速处理。
内容的提问来源于stack exchange,提问作者kunshabba
相关产品推荐
相关产品推荐

