You need to enable JavaScript to run this app. Pandas:将game列含NaN行的platform值合并至上一非空游戏对应单元格
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 05:45:03