Pandas如何基于列表指定条件对DataFrame行进行分组聚合
Pandas 按指定条件分组合并行的高效实现
现有代码的性能瓶颈来自循环遍历每一行数据,且每次匹配到符合条件的sport就对全量DataFrame执行一次分组操作,等价于重复执行几十甚至上万次全量分组,改用pandas向量化操作即可解决。
高效实现方案
核心思路是将数据集拆分为「需要分组的团队运动」和「不需要分组的个人运动」两部分,分别处理后再合并,全程无行遍历,10万行数据可在毫秒级完成。
完整代码
import pandas as pd # 配置参数 team_sports = ['football', 'basketball'] # 步骤1:生成布尔掩码拆分数据集,无需遍历行 mask = df['sport'].isin(team_sports) # 拆分需要分组的团队运动子集、不需要分组的个人运动子集 team_sport_df = df[mask] individual_sport_df = df[~mask] # 步骤2:仅对团队运动子集执行一次分组聚合 # 如果需要age为逗号拼接的字符串用这个实现 grouped_team = team_sport_df.groupby( ['country', 'sport'], as_index=False )['age'].apply(lambda x: ','.join(x.astype(str))) # 如果需要age为列表格式,替换为下面这行即可 # grouped_team = team_sport_df.groupby(['country', 'sport'], as_index=False)['age'].apply(list) # 步骤3:合并两部分结果,按需排序 result = pd.concat([grouped_team, individual_sport_df], ignore_index=True) # 可选:按国家、运动名称排序,和示例输出顺序一致 result = result.sort_values(by=['country', 'sport'], ignore_index=True)
性能说明
- 原有实现时间复杂度为O(N * M),N为数据行数,M为全量分组的时间开销
- 优化后实现时间复杂度为O(K),K为需要分组的团队运动行数,仅执行一次分组
对10万行规模的数据集,优化后运行速度提升可达数千倍。
内容的提问来源于stack exchange,提问作者Grog Grog
相关产品推荐
相关产品推荐

