You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于值长度条件为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:50:24