【发布时间】:2016-11-03 18:22:45
【问题描述】:
我想改进 python pandas 中 groupby 的时间。
我有这个代码:
df["Nbcontrats"] = df.groupby(['Client', 'Month'])['Contrat'].transform(len)
目标是计算客户在一个月内拥有多少合同,并将此信息添加到新列中 (Nbcontrats)。
-
Client:客户端代码 -
Month: 数据提取月份 -
Contrat: 合同号
我想改善时间。下面我只使用我的真实数据的一个子集:
%timeit df["Nbcontrats"] = df.groupby(['Client', 'Month'])['Contrat'].transform(len)
1 loops, best of 3: 391 ms per loop
df.shape
Out[309]: (7464, 61)
如何提高执行时间?
【问题讨论】:
-
我建议添加 numpy 标签。我记得@Divakar 提出了比使用 np.einsum 的 groupby 更快的解决方案。
-
@ayhan,你的意思是this解决方案吗?
-
@MaxU 不是熊猫专家,我想请教各位熊猫大师。所以,我可以想象
groupby在这里用df.groupby(['Client', 'Month'])做了什么。但是,那么使用['Contrat']选择/索引“Contrat”列可以实现什么?还是根本没有索引?从我的测试结果来看,索引不会影响最终结果。知道那里发生了什么吗? -
@Divakar 通常,
df.groupby(['Col1', 'Col2'])['Col3']按Col1和Col2对数据帧进行分组,并选择Col3(没有聚合,只有键(Col1,Col2)和值(Col3)对)。如果您进行聚合,比如说取平均值,它会为您提供每组 Col3 的平均值。如果您不指定任何列,只指定df.groupby(['Col1', 'Col2']),它将将该函数应用于所有列(尽可能)。在此示例中,OP 正在使用函数 len。由于组的长度不会随着列的变化而变化,所以它只是一个辅助列。 -
@Divakar,我正要回答你的问题,但@ayhan,更快... :) 正如ayhan 所说,如果我们使用列选择
['Contrat']transform(len)将仅适用于该列,否则将应用于所有列(在 groupby 操作后可用)
标签: python pandas numpy pandas-groupby