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

Pandas中groupby+apply(list)内存不足问题及优化方法

Pandas处理大数据集时的内存问题与优化方案

测试数据集构建

data = {'link': [1,2,3,4,5,6,7],
        'code': ['xx', 'xx', 'xy', '', 'aa', 'ab', 'aa'],
        'Name': ['Tom', 'Tom', 'Tom', 'Tom', 'nick', 'nick', 'nick'],
        'Age': [20,20,20,20, 21, 21, 21]}

# 创建DataFrame
df = pd.DataFrame(data)

print(df)

输出结果:

link code  Name  Age
0     1   xx   Tom   20
1     2   xx   Tom   20
2     3   xy   Tom   20
3     4        Tom   20
4     5   aa  nick   21
5     6   ab  nick   21
6     7   aa  nick   21

原代码的内存问题

以下代码在数据集子集上可正常运行,但在全量数据集执行时触发内存错误:

temp = df.groupby(['Name', 'Age'])['code'].apply(list).reset_index()
pd.merge(df, temp, on=['Name', 'Age']).explode('code_y').replace(r'^\s*$', np.nan, regex=True).dropna(subset='code_y').drop_duplicates()

全量数据集报错信息:

MemoryError: Unable to allocate 5.34 TiB for an array with shape (733324768776,) and data type object

问题根源:groupby.apply(list)会为每个分组生成包含大量重复元素的长列表,后续explode操作会将这些列表展开成巨量行,直接耗尽内存。

优化方案(当前最优)

通过提前去重避免生成冗余数据,大幅降低内存占用:

# 筛选相关列并直接去重,同时将空字符串转为缺失值
d = df[['code', 'Name', 'Age']].replace('', pd.NA).drop_duplicates()

# 执行合并并一步过滤掉code_y为空的行
df.merge(d, how='outer', on=['Name', 'Age']).dropna(subset=['code_y'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:22:05