假设我有以下数据框:
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_A
和 categorie_B
。好消息:这些列中的值通常不会因单个用户而改变。 df.groupby
仍然试图创建所有这些列的笛卡尔积,这使得计算变得不可能。
有效地做到这一点的最佳方法是什么?
答案 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