熊猫groupby和sum,同时保留其他属性

时间:2019-08-21 12:14:09

标签: python pandas dataframe pandas-groupby

我已经看到了熊猫aggregate函数的示例,但是这些并不能解决我的问题。因为聚合函数的示例将所有属性加总或仅将几个属性加总,并且结果df仅具有这些加总的属性或groupby中使用的属性。就我而言,我不想为分组依据或总和使用某些属性,而仍将其保留在结果df中。

我试图对一些属性进行分组和求和,同时保留其他未求和但面临如下挑战的属性。

snipped of data

在我的交易数据集中,Customer_ID对于每个客户都是唯一的,entry time对于每个交易都是唯一的。任何客户在一段时间内都会进行多次交易。大多数事务重复两次或更多次,具体取决于与事务关联的标签数量(但通常为2到4个标签)。我需要将每个事务的多个条目仅合并为1行,并包含1个customer_ID,一个genderageentry timelocation,{{ 1}}和所有标签属性。

如果我仅按countrycustomer_ID分组并加总 Tags ,则结果数据框将具有正确的唯一客户数量:150K。但是我在结果{中丢失了属性entry timegenderagelocationcountryexit timevalue 1 {1}}。

value 2

如果我按所有必需的属性分组并加总 Tags ,则我只能获得90K唯一客户,这是不正确的。

df

Example of rows for 1 transaction Example of how i want 1 transaction to be

因此,如何有效地仅按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)?

2 个答案:

答案 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调用以检索firstlastminmax值。

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'})
         )