如何基于指定列聚合Pandas DataFrame重复行(字符串场景)
解决方案:合并同一用户的多行评分数据
问题分析
核心需求是将同一用户的多行数据合并为单行,每个电影列保留该用户唯一的有效评分。需注意:你的数据中空值是空字符串而非Pandas默认的NaN,这是之前方法失效的关键——ffill等填充逻辑仅对NaN生效。
可行方案
无需逐个指定列名,通过三步即可完成处理,完美适配你的大数据集:
- 将所有空字符串替换为
pd.NA,让Pandas识别为空值 - 按
name分组,对每列取第一个非空值(因同一用户同一电影仅存在一个有效评分) - 重置索引,恢复
name为普通列
代码实现
import pandas as pd data = pd.DataFrame({ 'name': ['John', 'Jane', 'Joe', 'John', 'Jane', 'Joe'], 'movie1': ['', 'bad', 'avg', 'nice', '', ''], 'movie2': ['good', '', '', '', 'poor', ''], 'movie3': ['bad', '', 'good', '', '', ''], }) # 1. 替换空字符串为Pandas可识别的空值 data.replace('', pd.NA, inplace=True) # 2. 分组后提取每列的唯一有效评分 result = data.groupby('name', as_index=False).first() # 可选:将空值转回空字符串,匹配预期输出格式 result.fillna('', inplace=True) print("处理结果:") print(result)
输出结果
name movie1 movie2 movie3 0 Jane bad poor 1 Joe avg good 2 John nice good bad
之前方法失效的原因
ffill未生效:原数据是空字符串而非NaN,填充逻辑无法识别groupby('name').ffill()报错:分组后name转为索引,drop_duplicates('name')找不到对应列,触发KeyErrorapply(lambda x: x.fillna(method='ffill').iloc[0])无效:同样因空字符串未转NaN,填充逻辑未触发,仅保留了第一行原始值
内容的提问来源于stack exchange,提问作者Enzo Corsini
相关产品推荐
相关产品推荐

