[英]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()
会给我我正在寻找的连接对象。 请耐心等待,这是我实际处理的简化示例。
我认为解决方案可能是将gr1
和gr2
转换为熊猫数据帧,然后像往常一样将它们连接起来。
本质上,我的问题如下:
groupby
结果转换为数据框对象?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.