将DataFrame列转换为键值对时遇TypeError问题求助
DataFrame相邻列转键值对列表及TypeError解决方法
需求说明
原始DataFrame示例:
| id | A | B | C | D |
|---|---|---|---|---|
| 123 | 24 | 98 | 74 | 32 |
| 456 | 65 | 90 | 61 | 96 |
需要转换为:
| id | col1 |
|---|---|
| 123 | [{24:98},{74:32}] |
| 456 | [{65:90},{61:96}] |
转换逻辑:保留id列,将相邻列(如A与B、C与D)的对应行值组成键值对,再把这些键值对字典合并为列表存入col1列。
错误原因
你遇到的TypeError (unhashable type: 'list'),是因为代码中尝试用列表类型的数据作为字典的键——而字典的键必须是可哈希类型(比如数值、字符串、元组等),列表是不可哈希的,所以触发报错。这种情况通常是原始DataFrame中某些单元格的值是列表类型导致的。
修正后的代码
基础修复版(兼容含列表的单元格)
先把作为键的元素转成可哈希的元组(如果是列表的话),同时保留原有逻辑:
import pandas as pd # 示例DataFrame(模拟可能含列表的情况) df = pd.DataFrame({ 'id': [123, 456], 'A': [24, [65, 70]], 'B': [98, 90], 'C': [74, 61], 'D': [32, 96] }) result_list = [] for _, row in df.iterrows(): current_id = row['id'] key_value_pairs = [] # 遍历相邻列对 for i in range(1, len(row), 2): key = row[i] # 如果键是列表,转成元组(可哈希) if isinstance(key, list): key = tuple(key) key_value_pairs.append({key: row[i+1]}) result_list.append((current_id, key_value_pairs)) result_df = pd.DataFrame(result_list, columns=['id', 'col1']) print(result_df)
高效优化版(避免iterrows,适合大数据量)
如果你的DataFrame数据量较大,iterrows效率较低,可以用apply结合列表推导式实现:
import pandas as pd df = pd.DataFrame({ 'id': [123, 456], 'A': [24, 65], 'B': [98, 90], 'C': [74, 61], 'D': [32, 96] }) # 获取除id外的列名,按相邻分组 non_id_cols = df.columns.drop('id') col_pairs = [(non_id_cols[i], non_id_cols[i+1]) for i in range(0, len(non_id_cols), 2)] def process_row(row): pairs = [] for col1, col2 in col_pairs: key = row[col1] if isinstance(key, list): key = tuple(key) pairs.append({key: row[col2]}) return pairs result_df = df[['id']].copy() result_df['col1'] = df.apply(process_row, axis=1) print(result_df)
说明
- 如果原始DataFrame中所有单元格的值都是可哈希类型(比如示例中的数值),可以去掉
isinstance(key, list)的判断逻辑,直接生成键值对即可。 - 优化版通过列名分组的方式,比按位置索引更直观,也避免了因列顺序变化导致的错误。
内容的提问来源于stack exchange,提问作者Anusha Pal
相关产品推荐
相关产品推荐

