熊猫groupby对象唯一计数性能

时间:2018-12-27 08:15:29

标签: python pandas

我有一个庞大的交易数据集,看起来像:

| cust_no | acct_no | trans_id | product_id | ..... |

我尝试了几种方法来计算每个客户有多少个唯一帐户,以及客户购买了多少个独特产品等等。

  • 方法1.a

transaction_df[['cust_no','acct_no']].groupby('cust_no')['acct_no'].nunique()

平均运行91.5毫秒

  • 方法1.b

transaction_df.groupby('cust_no')['acct_no'].nunique()

平均运行85.5毫秒

  • 方法2.a

transaction_df[['cust_no','acct_no']].groupby(['cust_no','acct_no']).size().groupby('cust_no').size()

运行61.5毫秒

  • 方法2.a

transaction_df.groupby(['cust_no','acct_no']).size().groupby('cust_no').size()

运行55.3毫秒

我有两个问题:

  1. 切片后的DataFrame为什么运行得更慢,即transaction_df[['cust_no','acct_no']]transaction_df还要慢?

  2. 为什么.nunique()方法比仅堆叠两个groupby慢得多?

1 个答案:

答案 0 :(得分:0)

1)切片需要根据操作分配存储器和/或对象的副本。在这里,您需要在开始操作之前创建一个新的DataFrame。

2)nunique将实现逻辑或直接调用set,该逻辑运行时间为O(N)。 size将运行O(1)

在此进行实验时,了解有关数据集的先前结构信息可以帮助您优化函数选择。如有兴趣,请阅读https://en.wikipedia.org/wiki/Time_complexity