我已经看到了熊猫aggregate
函数的示例,但是这些并不能解决我的问题。因为聚合函数的示例将所有属性加总或仅将几个属性加总,并且结果df
仅具有这些加总的属性或groupby
中使用的属性。就我而言,我不想为分组依据或总和使用某些属性,而仍将其保留在结果df
中。
我试图对一些属性进行分组和求和,同时保留其他未求和但面临如下挑战的属性。
在我的交易数据集中,Customer_ID
对于每个客户都是唯一的,entry time
对于每个交易都是唯一的。任何客户在一段时间内都会进行多次交易。大多数事务重复两次或更多次,具体取决于与事务关联的标签数量(但通常为2到4个标签)。我需要将每个事务的多个条目仅合并为1行,并包含1个customer_ID
,一个gender
,age
,entry time
,location
,{{ 1}}和所有标签属性。
如果我仅按country
,customer_ID
分组并加总 Tags ,则结果数据框将具有正确的唯一客户数量:150K。但是我在结果{中丢失了属性entry time
,gender
,age
,location
,country
,exit time
,value 1
{1}}。
value 2
如果我按所有必需的属性分组并加总 Tags ,则我只能获得90K唯一客户,这是不正确的。
df
因此,如何有效地仅按result = df.groupby(["customer_ID","entry time"])["Tag1", "Tag2","Tag3","Tag4","Tag5","Tag6","Tag7","Tag8"].sum().reset_index()
和result = df.groupby(["customer_ID", "entry time", "gender", "age","location", "country", "exit time", "value 1", "value 2"
])["Tag1","Tag2","Tag3","Tag4","Tag5","Tag6","Tag7","Tag8"].sum().reset_index()
进行分组,对所有customer_ID
列求和,并仍保留结果entry time
中的其他属性(df大小约为700 MB)?
答案 0 :(得分:1)
好吧,如果我正确理解了这个问题,那么我认为这可能有效:
tag_cols = ["Tag1", "Tag2", "Tag3", "Tag4", "Tag5", "Tag6", "Tag7", "Tag8"]
join_cols = ["customer_ID", "entry time"]
df1 = df.groupby(join_cols)[tag_cols].sum().reset_index()
df2 = pd.merge(df1, df, on=tag_cols.append(join_cols), how="left")
然后df2
应该满足您的需求。
答案 1 :(得分:1)
从技术上讲,您尝试汇总唯一的 customer_ID 和输入时间(不是唯一的客户)。为了保持其他属性,必须做出一些汇总决定以保留哪些值。考虑扩展groupby().aggregate
调用以检索first
,last
,min
或max
值。
agg_df = (df.groupby(['customer_ID', 'entry time'], as_index=False)
.aggregate({'gender':'first', 'age':'first',
'location':'first', 'country':'first',
'exit time':'first', 'value 1':'first', 'value 2':'first',
'Tag1':'sum', 'Tag2':'sum', 'Tag3':'sum', 'Tag4':'sum',
'Tag5':'sum', 'Tag6':'sum', 'Tag7':'sum', 'Tag8':'sum'})
)