如何展示标识列的分组归属?修复Python代码TypeError报错
问题:修复Pandas代码中的TypeError错误
原始DataFrame
import pandas as pd df = pd.DataFrame({'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C'], 'identifier': [1, 2, 1, 3, 1, 2, 5, 4]}) print(df)
输出:
group identifier 0 A 1 1 A 2 2 A 1 3 A 3 4 B 1 5 B 2 6 B 5 7 C 4
期望输出
identifier in not_in 0 1 [A, B] [C] 1 2 [A, B] [C] 2 3 [A] [B, C] 3 4 [C] [A, B] 4 5 [B] [A, C]
错误代码及报错
编写的代码:
result = df.drop_duplicates(subset=['group', 'identifier']) \ .groupby('identifier')['group'].agg(list) \ .reset_index() \ .rename(columns={'group': 'in'}) \ .assign(not_in=lambda x: set(df['group']).difference(set(x['in']))) print(result)
运行报错:
TypeError: unhashable type: 'list'
修复方案
错误原因
报错核心问题有两个:
x['in']是DataFrame的整列数据,每个元素是列表,而set()要求元素必须可哈希(列表属于不可哈希类型),直接对整列转集合会触发错误;- 代码逻辑错误:需要对每行的
in列表单独计算不在其中的group,而非对整列做集合运算。
正确代码
import pandas as pd df = pd.DataFrame({'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C'], 'identifier': [1, 2, 1, 3, 1, 2, 5, 4]}) # 提前获取所有唯一的group集合,避免重复计算 all_groups = set(df['group'].unique()) result = df.drop_duplicates(subset=['group', 'identifier']) \ .groupby('identifier')['group'].agg(list) \ .reset_index() \ .rename(columns={'group': 'in'}) \ .assign(not_in=lambda x: x['in'].apply(lambda lst: list(all_groups.difference(lst)))) print(result)
代码说明
- 先提取所有唯一的group集合
all_groups,减少重复计算开销; - 使用
apply()遍历in列的每个列表元素,对单个列表做集合差运算,再转成列表格式; - 确保每行的
not_in都能对应计算出正确结果,同时避开了列表不可哈希的问题。
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

