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

Python Pandas问题:匹配两DataFrame的Noun列并计算平均Rating报错排查

问题分析与解决方案

你遇到的TypeError: unhashable type: 'list'错误,核心原因是df的Noun列是列表类型,而isin()和集合(set)都要求元素是可哈希的(hashable),但列表是不可哈希的——因为列表是可变对象,不能被作为集合的元素或者哈希表的键来使用。

更关键的是,你的原代码逻辑也不对:你需要的是检查df1的单个Noun值是否出现在df的某个Noun列表里,而df['Noun'].isin(set(df1['Noun']))是在检查整个列表是否完全匹配df1里的某个Noun值,这完全不符合你的需求。

正确的实现步骤

我们可以通过展开列表列 + 分组求均值 + 映射匹配的方式来实现需求:

  1. 展开df的Noun列表:把每个列表里的名词单独拆成一行,同时保留对应的Rating值
  2. 计算每个名词的平均Rating:按Noun分组,求Rating的平均值
  3. 将平均值映射到df1中:用df1的Noun值匹配对应的平均Rating

具体代码示例

import pandas as pd

# 假设你的df和df1是已初始化好的DataFrame
# 步骤1:展开Noun列表列,每个名词单独成一行
exploded_df = df.explode('Noun')

# 步骤2:按Noun分组,计算每个名词对应的Rating平均值
noun_avg_rating = exploded_df.groupby('Noun')['Rating'].mean()

# 步骤3:将平均值映射到df1的新列average中
df1['average'] = df1['Noun'].map(noun_avg_rating)

补充说明

  • 如果df1中有某些Noun值在df的Noun列表里从未出现过,map()会返回NaN,你可以用fillna()设置默认值,比如:
    df1['average'] = df1['Noun'].map(noun_avg_rating).fillna(0)  # 用0填充不存在的情况,也可以换成其他合理值
    
  • 如果你使用的pandas版本低于0.25(explode()是0.25版本新增的方法),可以用以下代码替代展开操作:
    exploded_df = df.assign(Noun=df['Noun'].apply(pd.Series)) \
                    .stack() \
                    .reset_index(level=1, drop=True) \
                    .to_frame('Noun') \
                    .join(df[['Rating']])
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:47:40