Python 熊猫中更快的groupby:值列表
我正在寻找重写pandas 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
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的一个简单版本。