如何避免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数据类型压缩内存,展示时再做前向填充即可。
操作步骤
- 标记重复值为NaN:按
Game ID分组,仅保留每组第一行的重复列值,其余行设为NaN - 优化内存类型:将重复列转为Nullable类型(比普通类型更节省内存,且支持NaN)
- 展示时前向填充:查看数据时用
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)
方案二:拆分表(规范化存储)
采用数据库范式化思路,将数据拆分为两张表,彻底消除冗余,是大型数据集的最优选择。
拆分逻辑
- 比赛进攻详情表:存储每一次进攻的逐行数据,包含
Game ID、Play Number、Play Type、Yard Gain - 比赛结果汇总表:存储单场比赛的唯一结果数据,包含
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
相关产品推荐
相关产品推荐

