连接多个大熊猫groupby输出

时间:2019-08-23 18:27:22

标签: python pandas concatenation pandas-groupby

我想对给定数据集的不同子集执行多个plyr::join()操作,并将它们全部绑定在一起。例如:

.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? 会给我我想要的连接对象。请忍受,这是我实际处理的一个简化示例。

I think the solution可能是将df.groupby(["ID","Subset"]).mean()gr1转换为熊猫数据帧,然后像往常一样将它们连接起来。

本质上,我的问题如下:

  1. 如何将gr2结果转换为数据框对象?
  2. 如果无需将序列转换为数据框就可以做到这一点,如何将两个groupby结果绑定在一起,然后将其转换为熊猫数据框?

PS:我来自R背景,因此对我来说,将数据帧按某种方式分组并以不同类型的对象(系列或多索引数据帧)输出输出是很奇怪的。这也是我的问题的一部分:groupby为什么返回一个序列?这是什么样的系列?一个系列为什么会有多列和一个索引?

1 个答案:

答案 0 :(得分:1)

示例中的返回类型是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


但是,如果您希望聚合多个功能,例如here,则此方法将无效。如果您希望避免使用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