我想对给定数据集的不同子集执行多个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
转换为熊猫数据帧,然后像往常一样将它们连接起来。
本质上,我的问题如下:
gr2
结果转换为数据框对象?groupby
结果绑定在一起,然后将其转换为熊猫数据框? PS:我来自R背景,因此对我来说,将数据帧按某种方式分组并以不同类型的对象(系列或多索引数据帧)输出输出是很奇怪的。这也是我的问题的一部分:groupby
为什么返回一个序列?这是什么样的系列?一个系列为什么会有多列和一个索引?
答案 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