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

如何快速将Pandas数据框中的分组转换为独立数组列表?

优化Pandas大数据分组转换效率的方案

你的原有实现效率低下的核心原因是循环中重复过滤整个DataFrame,每次df[df['grouping_var'] == group]都会扫描全量数据,对于8000万行的数据集,这种O(n*k)的时间复杂度完全不可行。下面是针对大数据量优化后的实现方案:

基础优化版

def convertPandaGroupstoArrays(df):
    # 先全局按分组列+时间列排序,避免每个分组单独排序
    df_sorted = df.sort_values(['grouping_var', 'time_series'])
    
    mySeries = []
    namesofmyseries = []
    
    # 直接遍历groupby对象,底层已做哈希分组优化
    for group_name, group_df in df_sorted.groupby('grouping_var'):
        # 提取目标列并设置索引,无需inplace操作
        ts_df = group_df[['time_series', 'value']].set_index('time_series')
        mySeries.append(ts_df)
        namesofmyseries.append(group_name)
    
    return mySeries, namesofmyseries

更简洁的列表推导式版本

def convertPandaGroupstoArrays(df):
    # 预排序减少分组内排序开销
    df_sorted = df.sort_values(['grouping_var', 'time_series'])
    
    grouped = df_sorted.groupby('grouping_var')
    namesofmyseries = list(grouped.groups.keys())
    # 用列表推导式批量生成结果,效率更高
    mySeries = [group[['time_series', 'value']].set_index('time_series') for _, group in grouped]
    
    return mySeries, namesofmyseries

进一步优化:转成轻量数组(如果不需要DataFrame格式)

如果最终只需要数值数组而非DataFrame,可直接转成numpy数组,进一步降低内存占用和处理时间:

def convertPandaGroupstoArrays(df):
    df_sorted = df.sort_values(['grouping_var', 'time_series'])
    grouped = df_sorted.groupby('grouping_var')
    
    namesofmyseries = list(grouped.groups.keys())
    mySeries = [group[['time_series', 'value']].set_index('time_series').to_numpy() for _, group in grouped]
    
    return mySeries, namesofmyseries

核心优化点说明

  1. 预排序替代分组内排序:全局排序只需要一次O(n log n)的操作,避免了每个分组单独排序的重复开销。
  2. groupby底层优化:Pandas的groupby采用哈希分组等高效算法,内部避免了重复扫描全量数据,时间复杂度降为O(n log n)(主要来自排序)。
  3. 简化分组名获取:直接从groupby对象的groups.keys()提取分组名,无需每个分组调用unique()。
  4. 避免不必要的inplace操作:inplace=True在循环中会增加额外的内存操作开销,直接返回新对象更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:26:55