Pandas:将game列含NaN行的platform值合并至上一非空游戏对应单元格
简洁实现方案
你需要的功能完全不需要手动维护全局缓存状态,用pandas原生的向下填充+分组聚合两步就能实现,效率和稳定性都比逐行遍历的写法好。
核心实现代码
先构造匹配你场景的测试数据,再执行处理:
import pandas as pd import numpy as np # 构造示例原始数据 raw_df = pd.DataFrame({ 'game': ['a', np.nan, np.nan, 'b', 'c', np.nan], 'platform': ['nintendo', 'ps4', 'xbox', 'ps4', 'ps4', 'xbox'] }) # 处理逻辑 # 1. 向下填充game列空值,让每个空值行自动匹配上方最近的非空game值 raw_df['game'] = raw_df['game'].ffill() # 2. 按game分组,把同组platform拼接为逗号分隔字符串 processed_df = raw_df.groupby('game', as_index=False)['platform'].agg( lambda x: ', '.join(pd.unique(x)) # 加pd.unique可自动去除重复平台值 )
运行后processed_df的输出完全匹配你期望的表格效果。
你原代码存在的问题
- 列名不匹配:代码中引用的
row['Name']、row['Platforms']和实际DataFrame的列名game、platform不一致,运行会直接触发KeyError - 分支逻辑反向:原代码写
elif not cache,即只有缓存为空时才执行平台追加操作,和预期的“缓存有收集到的空行平台时,才追加到对应游戏条目”的逻辑完全相反 - 状态遗漏:逐行处理完所有数据后,没有触发最后一次缓存内容的追加逻辑,会漏掉最后一行空值对应的平台值
- 鲁棒性差:手动判断类型加
math.isnan的空值检测,遇到None、pandas内置NA值时会判断失效;用set存储收集到的平台值是无序的,最后拼接出来的字符串顺序和原始数据顺序不一致;全局存储的last_non_nan初始固定为0,在DataFrame经过筛选、索引不连续的场景下会出现定位错误 - 效率偏低:逐行apply配合原地修改原表的写法,远慢于pandas原生的向量化填充、分组聚合操作,数据量增大时性能差距非常明显
内容的提问来源于stack exchange,提问作者minzi
相关产品推荐
相关产品推荐

