簡體   English   中英

連接多個 Pandas groupby 輸出

[英]Concatenate multiple pandas groupby outputs

我想對給定數據集的不同子集進行多個.groupby()操作並將它們綁定在一起。 例如:

import pandas as pd
df = pd.DataFrame({"ID":[1,1,2,2,2,3],"Subset":[1,1,2,2,2,3],"Value":[5,7,4,1,7,8]})
print(df)
   ID  Subset  Value
0   1       1      5
1   1       1      7
2   2       2      4
3   2       2      1
4   2       2      7
5   3       1      9

然后我想連接以下對象並將結果存儲在熊貓數據框中:

gr1 = df[df["Subset"] == 1].groupby(["ID","Subset"]).mean()
gr2 = df[df["Subset"] == 2].groupby(["ID","Subset"]).mean()
# Why do gr1 and gr2 have column names in different rows?

我意識到df.groupby(["ID","Subset"]).mean()會給我我正在尋找的連接對象。 請耐心等待,這是我實際處理的簡化示例。

我認為解決方案可能是將gr1gr2轉換為熊貓數據幀,然后像往常一樣將它們連接起來。

本質上,我的問題如下:

  1. 如何將groupby結果轉換為數據框對象?
  2. 如果這可以在不將系列轉換為數據框的情況下完成,您如何將兩個groupby結果綁定在一起,然后將其轉換為熊貓數據框?

PS:我來自 R 背景,所以對我來說,將數據幀按某些東西分組並將輸出返回為不同類型的對象(系列或多索引數據幀)是很奇怪的。 這也是我的問題的一部分:為什么.groupby返回一個系列? 這是一個什么樣的系列? 為什么一個系列可以有多個列和一個索引?

您示例中的返回類型是 pandas MultiIndex對象。 要為單個值返回具有單個轉換函數的數據幀,則可以使用以下內容。 請注意包含as_index=False


>>> gr1 = df[df["Subset"] == 1].groupby(["ID","Subset"], as_index=False).mean()
>>> gr1

    ID  Subset  Value
0    1       1      6


但是,如果您希望像此處這樣聚合多個函數,這將不起作用。 如果您希望避免使用df.groupby(["ID","Subset"]).mean() ,那么您可以使用以下示例。


>>> gr1 = df[df["Subset"] == 1].groupby(["ID","Subset"], as_index=False).mean()
>>> gr2 = df[df["Subset"] == 2].groupby(["ID","Subset"], as_index=False).mean()

>>> pd.concat([gr1, gr2]).reset_index(drop=True)

   ID   Subset  Value
0   1        1      6
1   2        2      4


如果您只關心處理特定的行子集,以下可能適用,因為它消除了連接結果的必要性。


>>> values = [1,2]
>>> df[df['Subset'].isin(values)].groupby(["ID","Subset"], as_index=False).mean()

    ID  Subset  Value
0   1        1      6
1   2        2      4

暫無
暫無

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

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