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

将DataFrame列转换为键值对时遇TypeError问题求助

DataFrame相邻列转键值对列表及TypeError解决方法

需求说明

原始DataFrame示例:

idABCD
12324987432
45665906196

需要转换为:

idcol1
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:51:23