使用函数索引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
相关产品推荐
相关产品推荐

