Python 熊猫中更快的groupby:值列表

Python 熊猫中更快的groupby:值列表,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我正在寻找重写pandas groupby的方法,以提高性能,因为当前版本将在感兴趣的数据集上持续多年: def to_df_with_lists(group, gby): ret_df = pd.DataFrame(columns=group.drop(gby, axis=1).columns, index=[0]) for col in group.drop(gby, axis=1).columns: ret_df.loc[0, col] = list(gro

我正在寻找重写pandas groupby的方法,以提高性能,因为当前版本将在感兴趣的数据集上持续多年:

def to_df_with_lists(group, gby):
    ret_df = pd.DataFrame(columns=group.drop(gby, axis=1).columns, index=[0])
    for col in group.drop(gby, axis=1).columns:
        ret_df.loc[0, col] = list(group[col].values)
        if len(ret_df.loc[0, col]) == 1:
            ret_df.loc[0, col] = ret_df.loc[0, col][0]
    return ret_df
基本上,对于给定的groupby,它将值保存到列表中。我不能使用多行,因为我以类似的格式将其与其他数据帧合并,然后所有列表的长度都不同,稍后我将其转换为另一种格式

由此:

我想说明一下,如果列表的长度为1,那么groupby函数将返回一个值,而不是包含该值的列表:

我知道这并不是处理数据帧的最佳/常用方法,但我还没有找到让我做我想做的事情的格式

数据帧示例:

import pandas as pd
df_sub = pd.DataFrame({'director_id': [9970, 9970, 9970, 9970, 9970], 
                       'genre': ['Adventure', 'Comedy', 'Crime', 'Drama', 'Romance'],
                       'prob': [0.041667, 0.083333, 0.166667, 0.833333, 0.083333]},
                      index=[17317, 17318, 17319, 17320, 17321])
group = df_sub.groupby('director_id').get_group(9970)

除了让单例列表原子化(这让我觉得是个坏主意)之外,以下方法很有效:

df_sub.groupby('director_id').agg(lambda x: list(x))

无论它是否比您的代码快得多,我不能说示例太小。

如果列表长度为1,您的示例将返回一个列表,而不是单个项目。否则,我也会觉得这是个坏主意,但我还没有想出更好的解决方案。你不需要lambda函数-。agglist就可以了fine@Valeria如果你真的想要你的单态原子,用:df_sub.groupby'director_id'。如果lenx==1,则用x:x替换上面的listx@GrzegorzSkibinski符合事实的出于某种原因,我一直在做列表,但失败了,但如果我们想要OP想要的东西,那么lambda就会回来。@IgorRivin它的工作速度要快得多。事实上,我刚刚在一个更大的例子中尝试过它。我已经重写了很多次脚本,以至于我完全忽略了我的groupby的一个简单版本。