如何在Pandas DataFrame中按值长度为身高列补零格式化?
解决DataFrame身高列格式转换及个位数英寸补零问题
问题分析
你需要将5'8"这类格式转换为X Feet XX Inches,已完成基础替换,但个位数英寸未补零,之前的字符串索引操作因Series切片逻辑错误、空值(float类型)导致失败。
最优解决方案:从源数据拆分格式化(推荐)
直接从原始的X'Y"格式提取英尺和英寸数值,通过字符串格式化自动补零,比基于替换后字符串修改更可靠:
# 提取英尺和英寸的数字部分 df[['feet', 'inches']] = df['Height'].str.extract(r'(\d+)\'(\d+)\"') # 格式化输出,英寸不足两位自动补零 df['Height'] = df.apply(lambda x: f"{x['feet']} Feet {x['inches'].zfill(2)} Inches", axis=1)
基于现有替换结果的修复方案
如果要在你已完成替换的字符串基础上修改,可通过正则匹配单个数字的英寸部分直接替换,无需判断字符串长度:
# 针对"X Feet Y Inches"格式,把单个数字的英寸替换为0Y df['Height'] = df['Height'].str.replace(r'(\d+) Feet (\d) Inches', r'\1 Feet 0\2 Inches')
原代码错误原因及修复
第一个代码无变化的原因
你使用df.Height[:8]是对整个Series取前8行数据,而非每个字符串的前8个字符,需改用.str方法实现逐元素切片:df['Height'] = np.where( df.Height.str.len() == 15, df.Height.str[:8] + '0' + df.Height.str[8:], df.Height )第二个代码TypeError的原因
列中存在NaN(float类型),当apply访问x['Height']时,float对象无法切片。需先将列转为字符串类型,或在lambda中处理空值:# 先转字符串避免float报错 df['Height'] = df['Height'].astype(str) df['Height'] = np.where( df['Height'].str.len() == 15, df.apply(lambda x: x['Height'][:8]+'0'+x['Height'][8:], axis=1), df['Height'] )
内容的提问来源于stack exchange,提问作者Lord Bobbymort
相关产品推荐
相关产品推荐

