【发布时间】:2014-04-14 08:50:03
【问题描述】:
我想为我的数据框创建一个基于 anther 列的列。例如,我有一个这样的数据框:
Content Date
ID
Bob birthday 2010.03.01
Bob school 2010.04.01
Tom shopping 2010.02.01
Tom work 2010.09.01
Tom holiday 2010.10.01
我想生成一个等于ID 大小的列,因此生成的数据框如下所示:
Content Date Size
ID
Bob birthday 2010.03.01 2
Bob school 2010.04.01 2
Tom shopping 2010.02.01 3
Tom work 2010.09.01 3
Tom holiday 2010.10.01 3
标准方式似乎使用groupby 和transform。代码将完成工作:
df['Size'] = df['Date'].groupby(df.index).transform(np.size)
问题是,transform 运行速度非常慢。在具有大约40k 行的数据框中,上面的代码在我的PC 上占用的时间超过10 sec。我经常处理大于 100 万行的数据集,并且经常生成基于组的变量。
问题在于transform。例如,如果我使用
cumcount
# method 1: use groupby attribute 'cumcount'
df['cumcount'] = df['Date'].groupby(df.index).cumcount()
# method 2: use 'transform'
df['cumcount'] = df['Date'].groupby(df.index).transform(lambda x: np.arange(0, len(x)))
method 1 大约需要 0.2 sec 而 method 2 再次需要大约 14 sec。不过groupby好像没有group size, group max, group mean等生成列的属性,这里有没有其他方法可以提高性能?
感谢任何帮助。
【问题讨论】:
-
df['cumcount'] = df['Date'].groupby(df.index).transform('count')的表现如何? -
@EdChum,谢谢。我刚刚测试了它。大约需要
11 sec,类似于tranform(np.size)。我认为问题在于transform,而不是它调用的函数。 -
我刚刚对您的示例数据进行了
%timeit并看到了相同的结果 -
您是否尝试在您的 groupby 上执行多个聚合函数?您可以传递函数名称列表:pandas.pydata.org/pandas-docs/stable/…
-
@EdChum,不,我正在尝试生成一个包含统计信息的列,这正是文档中的
transform所做的:pandas.pydata.org/pandas-docs/stable/…,除了我对速度不满意。这可以在 STATA 中非常快地完成,我相信 python 也可以做得很好。