如何高效为大型Pandas DataFrame应用多参数函数计算流行度
高效计算婴儿姓名流行度的Pandas方案
核心思路
避开逐行apply的低效循环,改用Pandas原生的向量化分组操作,先计算年度总出生人数,再完成比例运算。
方法一:groupby.transform(最优性能)
这是最简洁高效的实现,无需额外合并操作,直接将分组结果广播到原数据的对应行:
# 生成与原DataFrame同长度的年度总出生数列 df['year_total'] = df.groupby('Year')['Count'].transform('sum') # 计算百万分比流行度 df['popularity'] = (df['Count'] / df['year_total']) * 1_000_000 # 可选:清理中间列 df.drop('year_total', axis=1, inplace=True)
方法二:预计算年度总数后合并
如果需要更清晰的分步逻辑,可以先单独计算年度统计结果,再合并回原数据:
# 预计算每年的总出生人数 year_totals = df.groupby('Year')['Count'].sum().reset_index(name='year_total') # 将年度总数合并到原DataFrame df = df.merge(year_totals, on='Year', how='left') # 计算流行度 df['popularity'] = (df['Count'] / df['year_total']) * 1_000_000 # 可选:清理中间列 df.drop('year_total', axis=1, inplace=True)
效率说明
- 两种方法均采用向量化运算,彻底避开了
apply的逐行循环(这是你之前耗时极长的核心原因)。 - 处理195万行数据的时间通常在几秒到几十秒级别,远优于原方案的84小时预估。
验证示例
针对你提到的场景:
1950年Mary(女)有50000人,当年总出生200万,流行度为25000
计算逻辑:(50000 / 2000000) * 1_000_000 = 25000,与预期结果完全匹配。
内容的提问来源于stack exchange,提问作者PeteyPablo
相关产品推荐
相关产品推荐

