[英]groupby and sum with pandas for certain columns while including other columns also
[英]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
,一個gender
, age
, entry time
, location
, country
和所有Tag屬性。
如果我僅按customer_ID
, entry time
分組並對Tag求和,則結果數據幀將具有正確的唯一客戶數:150K。 但是我在生成的df
丟失了gender
, age
, location
, country
, exit time
, value 1
和value 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()
那么,如何有效地僅按customer_ID
和entry 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
調用以檢索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'})
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.