簡體   English   中英

熊貓groupby和sum,同時保留其他屬性

[英]Pandas groupby and sum while retaining other attributes

我已經看到了Pandas aggregate函數的示例,但是這些並不能解決我的問題。 因為聚合函數的示例要么對所有屬性求和,要么對幾個屬性求和,結果df僅具有這些求和的屬性或groupby使用的屬性。 就我而言,我不想為group by或sum使用某些屬性,而仍將它們保留在結果df

我試圖對一些屬性進行分組和求和,同時保留其他未求和但面臨如下挑戰的屬性。

數據片段

在我的交易數據集中, Customer_ID對於每個客戶都是唯一的, entry time對於每個交易都是唯一的。 任何客戶在一段時間內都會進行多次交易。 大多數事務重復兩次或更多次,具體取決於與事務關聯的標簽數量(但通常為2到4個標簽)。 我需要將每筆交易的多個條目僅合並為1行,帶有1 customer_ID ,一個genderageentry timelocationcountry和所有Tag屬性。

如果我僅按customer_IDentry time分組並對Tag求和,則結果數據幀將具有正確的唯一客戶數:150K。 但是我在生成的df丟失了genderagelocationcountryexit timevalue 1value 2這兩個屬性。

result = df.groupby(["customer_ID","entry time"])["Tag1", "Tag2","Tag3","Tag4","Tag5","Tag6","Tag7","Tag8"].sum().reset_index()

如果我按所有需要的屬性分組並匯總Tag ,則我只能獲得90K唯一客戶,這是不正確的。

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()

1個事務的行示例 我想要1次交易的示例

那么,如何有效地僅按customer_IDentry time分組,對所有Tag列求和,並仍然在生成的df保留其他屬性(df大小約為700 MB)?

好吧,如果我正確理解了這個問題,那么我認為這可能會起作用:

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應該具有您所需要的。

從技術上講,您正在嘗試匯總唯一的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'})
         )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM