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

如何避免DataFrame重复值占用内存?可选方案探讨

处理DataFrame重复列的内存优化与展示方案

问题背景

现有如下DataFrame,其中Home Win、Final Home Score、Final Away Score列针对同一Game ID存在大量重复值,需要在节省内存的同时实现前向填充展示,或确认是否必须拆分表。

Game ID  Play Number   Play Type  Yard Gain  Home Win  Final Home Score  Final Away Score
0        1            1        Pass         10      True                28                14
1        1            2         Run          5      True                28                14
2        1            3        Pass         12      True                28                14
3        1            4        Pass          8      True                28                14
4        1            5  Field Goal          0      True                28                14

方案一:内存优化+前向填充展示

无需拆分表,通过标记重复值为NaN并使用Nullable数据类型压缩内存,展示时再做前向填充即可。

操作步骤

  1. 标记重复值为NaN:按Game ID分组,仅保留每组第一行的重复列值,其余行设为NaN
  2. 优化内存类型:将重复列转为Nullable类型(比普通类型更节省内存,且支持NaN)
  3. 展示时前向填充:查看数据时用ffill()自动填充空值

代码示例

import pandas as pd

# 构造原始DataFrame
data = {
    'Game ID': [1,1,1,1,1],
    'Play Number': [1,2,3,4,5],
    'Play Type': ['Pass', 'Run', 'Pass', 'Pass', 'Field Goal'],
    'Yard Gain': [10,5,12,8,0],
    'Home Win': [True, True, True, True, True],
    'Final Home Score': [28,28,28,28,28],
    'Final Away Score': [14,14,14,14,14]
}
df = pd.DataFrame(data)

# 标记重复列的非首行值为NaN
duplicate_cols = ['Home Win', 'Final Home Score', 'Final Away Score']
df[duplicate_cols] = df.groupby('Game ID')[duplicate_cols].transform(
    lambda x: x.where(x.index == x.first_valid_index())
)

# 转换为节省内存的Nullable类型
df['Home Win'] = df['Home Win'].astype('boolean')
df['Final Home Score'] = df['Final Away Score'] = df[['Final Home Score', 'Final Away Score']].astype('Int8')

# 展示时前向填充空值
display_df = df.ffill()
print(display_df)

方案二:拆分表(规范化存储)

采用数据库范式化思路,将数据拆分为两张表,彻底消除冗余,是大型数据集的最优选择。

拆分逻辑

  1. 比赛进攻详情表:存储每一次进攻的逐行数据,包含Game ID、Play Number、Play Type、Yard Gain
  2. 比赛结果汇总表:存储单场比赛的唯一结果数据,包含Game ID、Home Win、Final Home Score、Final Away Score

代码示例

# 拆分进攻详情表
plays_df = df[['Game ID', 'Play Number', 'Play Type', 'Yard Gain']].copy()

# 拆分比赛结果表(自动去重,每个Game ID仅保留一条记录)
games_df = df[['Game ID', 'Home Win', 'Final Home Score', 'Final Away Score']].drop_duplicates().reset_index(drop=True)

# 需要完整数据时,通过Game ID关联两张表
merged_df = pd.merge(plays_df, games_df, on='Game ID')

方案选择建议

  • 若数据量不大,且需频繁查看完整填充后的数据,优先选方案一
  • 若数据量大、需按比赛维度做统计分析,方案二的规范化存储更高效,也更便于维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:58:13