基于值长度条件为Pandas DataFrame列赋值的问题及报错
解决Pandas按字符串长度创建新列的报错及异常问题
问题需求
基于现有列df_dr_dp_lj['kode_wilayah']的字符串长度,创建两个新列:
kode_kelurahan:存储长度大于8的kode_wilayah值kode_kecamatan:存储长度小于等于8的kode_wilayah值
尝试的错误代码
if df_dr_dp_lj['kode_wilayah'].str.len() > 8: df_dr_dp_lj['kode_kelurahan']=df_dr_dp_lj['kode_wilayah'] else : df_dr_dp_lj['kode_kecamatan']=df_dr_dp_lj['kode_wilayah']
报错信息
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
报错原因
直接用if判断Pandas Series的布尔值是不允许的——Series是一组布尔值集合,Pandas无法确定你要判断任意一个还是全部元素满足条件,因此抛出模糊性错误。必须使用Pandas支持的矢量化操作实现逐行条件赋值。
正确解决方案
方法1:使用np.where实现矢量化赋值
import numpy as np # 给kode_kelurahan赋值:长度>8时取原值,否则为NaN df_dr_dp_lj['kode_kelurahan'] = np.where( df_dr_dp_lj['kode_wilayah'].str.len() > 8, df_dr_dp_lj['kode_wilayah'], np.nan ) # 给kode_kecamatan赋值:长度<=8时取原值,否则为NaN df_dr_dp_lj['kode_kecamatan'] = np.where( df_dr_dp_lj['kode_wilayah'].str.len() <= 8, df_dr_dp_lj['kode_wilayah'], np.nan )
方法2:使用loc索引逐条件赋值
import numpy as np # 先初始化两列为NaN df_dr_dp_lj['kode_kelurahan'] = np.nan df_dr_dp_lj['kode_kecamatan'] = np.nan # 按条件给对应列赋值 df_dr_dp_lj.loc[df_dr_dp_lj['kode_wilayah'].str.len() > 8, 'kode_kelurahan'] = df_dr_dp_lj['kode_wilayah'] df_dr_dp_lj.loc[df_dr_dp_lj['kode_wilayah'].str.len() <= 8, 'kode_kecamatan'] = df_dr_dp_lj['kode_wilayah']
后续异常问题排查(长度>8数据异常)
若使用上述方案后仍存在异常,可按以下步骤排查:
- 检查数据类型:确保
kode_wilayah是字符串类型,若为数值型需先转换:df_dr_dp_lj['kode_wilayah'] = df_dr_dp_lj['kode_wilayah'].astype(str) - 清理字符串空格:去除首尾空格或不可见字符,避免长度计算错误:
df_dr_dp_lj['kode_wilayah'] = df_dr_dp_lj['kode_wilayah'].str.strip() - 查看异常数据详情:打印长度>8的所有数据,分析具体问题:
print(df_dr_dp_lj[df_dr_dp_lj['kode_wilayah'].str.len() > 8])
内容的提问来源于stack exchange,提问作者PiPio
相关产品推荐
相关产品推荐

