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)