我有一个庞大的交易数据集,看起来像:
| cust_no | acct_no | trans_id | product_id | ..... |
我尝试了几种方法来计算每个客户有多少个唯一帐户,以及客户购买了多少个独特产品等等。
transaction_df[['cust_no','acct_no']].groupby('cust_no')['acct_no'].nunique()
平均运行91.5毫秒
transaction_df.groupby('cust_no')['acct_no'].nunique()
平均运行85.5毫秒
transaction_df[['cust_no','acct_no']].groupby(['cust_no','acct_no']).size().groupby('cust_no').size()
运行61.5毫秒
transaction_df.groupby(['cust_no','acct_no']).size().groupby('cust_no').size()
运行55.3毫秒
我有两个问题:
切片后的DataFrame为什么运行得更慢,即transaction_df[['cust_no','acct_no']]
比transaction_df
还要慢?
为什么.nunique()
方法比仅堆叠两个groupby
慢得多?
答案 0 :(得分:0)
1)切片需要根据操作分配存储器和/或对象的副本。在这里,您需要在开始操作之前创建一个新的DataFrame。
2)nunique
将实现逻辑或直接调用set
,该逻辑运行时间为O(N)。 size
将运行O(1)
在此进行实验时,了解有关数据集的先前结构信息可以帮助您优化函数选择。如有兴趣,请阅读https://en.wikipedia.org/wiki/Time_complexity