Python 通过使用一个热编码/重叠掩码的另一个数据帧进行分组
我有两个数据框,其中行上有观察值,列上有特征(或组成员资格),例如:Python 通过使用一个热编码/重叠掩码的另一个数据帧进行分组,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我有两个数据框,其中行上有观察值,列上有特征(或组成员资格),例如: > data_df a b c A 1 2 1 B 0 1 3 C 0 0 1 D 2 1 1 E 1 1 1 > mask_df g1 g2 A 0 1 B 1 0 C 1 0 D 1 0 E 0 1 我希望根据第二个数据帧
> data_df
a b c
A 1 2 1
B 0 1 3
C 0 0 1
D 2 1 1
E 1 1 1
> mask_df
g1 g2
A 0 1
B 1 0
C 1 0
D 1 0
E 0 1
我希望根据第二个数据帧(mask_df
)中的二进制值(掩码)对第一个数据帧(data_df
)中的值进行分组和聚合(求和)。结果应为以下(组x特征):
pandas中是否有方法在单个命令中使用第二个数据帧(
mask_df
)中包含的掩码对第一个数据帧(data_df
)进行分组 最好的方法是组合数据帧。可以先使用join语句在索引上进行合并df\u merge=data\u df.merge(aggr\u df,left\u on=True,right\u on=True)
。然后您可以使用df\u merge
进行分组操作。下面是一种使用列表理解的方法:
pd.DataFrame([(data_df.T * mask_df[i]).sum(axis=1) for i in mask_df.columns],
index = mask.columns)
a b c
g1 2 2 5
g2 2 3 2
您可以使用
dot
和groupby
以较低的成本实现这一点:
data_df.groupby(mask_df.dot(mask_df.columns)).sum()
a b c
g1 2 2 5
g2 2 3 2
在哪里,
mask_df.dot(mask_df.columns)
A g2
B g1
C g1
D g1
E g2
dtype: object
假设每一行始终有一列设置为
1
,则该选项效果良好 注意,即使在第一个数据帧(data_-df
)中的观测值属于第二个数据帧(mask_-df
)中的多个掩码的情况下,这也会起作用
我决定写另一个答案,因为:
- 的答案仅适用于一个热编码
- 这个问题的答案很难平行化,因为它是基于听写理解的
mask_df
与data_df
的点积获得相同的结果:
> mask_df.T.dot(data_df)
在获得平均值而不是总和的特殊情况下,这是可以实现的,通过每组的数量缩放mask_df
:
> mask_df.T.dot(data_df).div(mask_df.sum(), axis=0)
我以为点是矩阵乘法的工具,但我很难理解它是如何产生期望的结果的。(这可能是缺乏对如何在引擎盖下工作的理解。)@Polkaguy6000熊猫
dot
功能已经扩展到使用字符串来做这样的酷东西。当mask_df
是布尔数据帧时,它似乎也起作用。幸运的是,这(虽然很快)解决方案仅适用于非重叠遮罩,请参阅W-B或我的答案以获得更一般的解决方案(在求和/平均聚合的情况下)。@gc5尼斯,感谢您指出区别。我对你的答案投了更高的票。这是一个更一般的答案。然而,这是非常缓慢的。请参阅我的答案,以获得求和/平均值聚合的更快解决方案。
> mask_df.T.dot(data_df)
> mask_df.T.dot(data_df).div(mask_df.sum(), axis=0)