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

Pandas处理CSV多列赋值时报TypeError: unhashable type: 'list'

报错原因

触发TypeError: unhashable type: 'list'的直接原因是DataFrame多列赋值的列选择语法写错了:

  • pandas选取多列时,要求传入一个包含所有目标列名的单层列表,格式为df[['列名1', '列名2']]
  • 你写的soil_gINT_df[['USCS Major Constituent 1'],['Additional Description']]相当于给方括号内传入了两个独立列表组成的元组,pandas会把这个元组当成单个列名去校验,而列表是不可哈希类型,无法作为列索引的匹配键,直接抛出类型错误。

另外你的自定义拆分函数本身存在逻辑隐患:

  1. 调用split(',')时未指定拆分次数,会按文本中所有逗号做全量拆分,不符合「只按第一个逗号拆分」的需求
  2. 手动通过len(major)+2切片取后半段内容,默认假设逗号后固定跟1个空格,遇到逗号后无空格、多空格的场景会出现内容截断或多余字符的问题
  3. 无逗号场景的判断逻辑可以简化,不需要通过长度对比实现。
修复方案

方案1:修正原有代码(最小改动)

首先修正自定义拆分函数,用split的maxsplit参数替代手动切片:

def soil_description(text_block):
    # 只按第一个逗号拆分,最多拆成2段,先转字符串兼容空值/非字符串类型
    text_list = str(text_block).split(',', maxsplit=1)
    if len(text_list) == 1:
        # 没有逗号的情况
        major = ''
        minor = text_list[0]
    else:
        major = text_list[0].strip() # 可选:去掉前后多余空格
        minor = text_list[1].strip() # 可选:去掉前后多余空格
    return major, minor

然后修正赋值语句的列选择语法,把两个列名放到同一个列表里:

soil_gINT_df[['USCS Major Constituent 1', 'Additional Description']] = fgd_og_df.apply(
    lambda row: pd.Series(soil_description(row['Description'])),axis=1
)

方案2:pandas向量化实现(性能更优,推荐)

如果数据量较大,不建议用apply逐行循环,直接用pandas内置的字符串向量化方法,运行速度快数倍:

# 按第一个逗号拆分,expand=True直接返回两列结构的DataFrame
split_df = fgd_og_df['Description'].str.split(',', n=1, expand=True)
# 处理无逗号的行:拆分后第二列为空时,把原文本放到第二列,第一列置空
no_comma_rows = split_df[1].isna()
split_df.loc[no_comma_rows, 1] = split_df.loc[no_comma_rows, 0]
split_df.loc[no_comma_rows, 0] = ''
# 去掉内容前后多余空格(按需启用)
split_df = split_df.apply(lambda col: col.str.strip())
# 赋值到目标列
soil_gINT_df[['USCS Major Constituent 1', 'Additional Description']] = split_df

内容的提问来源于stack exchange,提问作者mylesmoose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:45:34