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

使用函数索引Pandas DataFrame报错:unhashable type: 'list' 原因排查

Pandas .loc 传入返回元组的可调用函数报错原因解析

先看初始的DataFrame:

a  b  c
u  5  0  3
v  3  7  9
w  3  5  2

我希望通过可调用函数选择DataFrame的行和列,这个函数接收DataFrame为参数,返回由行标签列表、列标签列表组成的元组,比如用lambda实现:

get_labels = lambda df: (['v', 'u'], ['c'])

直接把标签字面量传入.loc能得到预期结果:

df.loc[['v', 'u'], ['c']]

输出:

c
v  9
u  3

但按照文档说明传入可调用函数时却报错:

df.loc[get_labels]

报错信息:

unhashable type: 'list'

问题出在哪里?(线索:Pandas似乎尝试用函数结果创建Index对象,文档未解释原因。)

完整测试代码:

import numpy.random as npr
import pandas as pd
npr.seed(0)

df = pd.DataFrame(npr.randint(10, size=(3,3)),
                  index=['u','v','w'],
                  columns=['a','b','c'])

get_labels = lambda df: (['v', 'u'], ['c'])
print(df.loc[['v', 'u'], ['c']])
print(df.loc[get_labels])

问题根源

当你给.loc传入单个可调用函数时,Pandas会把这个函数的返回值当作纯行索引选择器处理,而非同时对应行和列的元组。它会尝试将函数返回的(['v', 'u'], ['c'])转换为行索引对象,但元组内包含不可哈希的列表,无法作为索引元素,因此抛出unhashable type: 'list'错误。

正确用法

如果想用可调用函数同时指定行和列选择,需要拆分到.loc的行、列参数位置分别处理:

方法1:行、列各自传入可调用函数

get_rows = lambda df: ['v', 'u']
get_cols = lambda df: ['c']
print(df.loc[get_rows, get_cols])

方法2:行用可调用函数,列直接指定(反之亦然)

print(df.loc[lambda df: ['v', 'u'], ['c']])

方法3:封装完整选择逻辑到函数

如果想把行、列选择逻辑打包,直接返回切片后的DataFrame更直观:

def select_target(df):
    return df.loc[['v', 'u'], ['c']]

print(select_target(df))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:01:04