使用多列聚合大型熊猫数据框

时间:2021-04-26 15:29:57

标签: python-3.x pandas aggregate

假设我有以下数据框:

import pandas as pd
df = pd.DataFrame({'user': ['00001C05', '00001C05', '00001C05', '00007142'],
    'mois_couverture': ['01-2018', '01-2018', '02-2018', '01-2018'],
               'categorie_A': ['x', 'x', 'x', 'y'],
               'categorie_B': ['v', 'v', 'v', 'w'],
               'revenue': [40, 50, 40, 100]})


       user mois_couverture categorie_A categorie_B  revenue
0  00001C05         01-2018           x           v       40
1  00001C05         01-2018           x           v       50
2  00001C05         02-2018           x           v       40
3  00007142         01-2018           y           w      100

现在我想使用所有其他列作为 id 列来聚合列 revenue

对于这里的玩具示例,只需:

df.groupby(['user', 'mois_couverture', 'categorie_A', 'categorie_B'])['revenue'].sum()

user      mois_couverture  categorie_A  categorie_B
00001C05  01-2018          x            v               90
          02-2018          x            v               40
00007142  01-2018          y            w              100

但是,就我而言,这是不可行的,因为数据框非常大,而且还有很多列,例如 categorie_Acategorie_B。好消息:这些列中的值通常不会因单个用户而改变。 df.groupby 仍然试图创建所有这些列的笛卡尔积,这使得计算变得不可能。

有效地做到这一点的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

你想要这个吗? -

col_list  = list(df.columns.values)
col_list.remove('revenue')
df.groupby(col_list)['revenue'].sum()

答案 1 :(得分:0)

似乎分组数据帧的索引很大。

只是一个想法:您可以创建 temp 列,您可以在其中计算要分组的列的哈希值,然后对该列进行分组。例如:

df["tmp"] = df[["user", "mois_couverture", "categorie_A", "categorie_B"]].apply(
    lambda x: hash(tuple(x)), axis=1
)
x = df.groupby("tmp").first()
x.update(df.groupby("tmp")["revenue"].sum())
print(x)

打印:

                          user mois_couverture categorie_A categorie_B  revenue
tmp                                                                            
-7695693783280321891  00007142         01-2018           y           w      100
-3471124568195598737  00001C05         01-2018           x           v       90
 7608015921576661100  00001C05         02-2018           x           v       40