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

如何展示标识列的分组归属?修复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'

修复方案

错误原因

报错核心问题有两个:

  1. x['in']是DataFrame的整列数据,每个元素是列表,而set()要求元素必须可哈希(列表属于不可哈希类型),直接对整列转集合会触发错误;
  2. 代码逻辑错误:需要对每行的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)

代码说明

  1. 先提取所有唯一的group集合all_groups,减少重复计算开销;
  2. 使用apply()遍历in列的每个列表元素,对单个列表做集合差运算,再转成列表格式;
  3. 确保每行的not_in都能对应计算出正确结果,同时避开了列表不可哈希的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:02:19