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值,这完全不符合你的需求。
正确的实现步骤
我们可以通过展开列表列 + 分组求均值 + 映射匹配的方式来实现需求:
- 展开df的Noun列表:把每个列表里的名词单独拆成一行,同时保留对应的
Rating值 - 计算每个名词的平均Rating:按Noun分组,求Rating的平均值
- 将平均值映射到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
相关产品推荐
相关产品推荐

