Python 基于两个不同数据帧的掩码?

Python 基于两个不同数据帧的掩码?,python,pandas,dataframe,group-by,mask,Python,Pandas,Dataframe,Group By,Mask,假设我有两个数据帧: In [1]: dates = pd.date_range('20170101',periods=6) df1 = pd.DataFrame(np.empty([len(dates),2]),index=dates,columns=['foo','bar']) df1['foo'].loc[0:2] = 'A' df1['bar'].loc[0:3] = 'A' df1['foo'].loc[2:6] = 'B' df1['bar'].loc[3:6] = 'B' df2

假设我有两个数据帧:

In [1]: dates = pd.date_range('20170101',periods=6)
df1 = pd.DataFrame(np.empty([len(dates),2]),index=dates,columns=['foo','bar'])
df1['foo'].loc[0:2] = 'A'
df1['bar'].loc[0:3] = 'A'
df1['foo'].loc[2:6] = 'B'
df1['bar'].loc[3:6] = 'B'
df2 = pd.DataFrame(np.random.randint(10,size=(6,2)),index=dates,columns=df1.columns)
print(df1)
print(df2)

Out [1]:
           foo bar
2017-01-01   A   A
2017-01-02   A   A
2017-01-03   B   A
2017-01-04   B   B
2017-01-05   B   B
2017-01-06   B   B 

            foo  bar
2017-01-01    5    3
2017-01-02    6    9
2017-01-03    5    9
2017-01-04    7    5
2017-01-05    0    2
2017-01-06    0    0
我对创建第三个df感兴趣,该df基于df1填充了df2的最大值。例如,输出如下所示:

            foo  bar
2017-01-01    6    9
2017-01-02    6    9
2017-01-03    7    9
2017-01-04    7    5
2017-01-05    7    5
2017-01-06    7    5

当然有一种简洁的方法可以做到这一点,对吗?

一个选项是连接两个数据帧并为每个数据帧分配一个键,将生成的数据帧转换为长格式,然后计算按键和列名分组的最大值:

(pd.concat([df1, df2], keys=["one", "two"], axis=1)
 .stack(level=1).groupby(level=1)
 .apply(lambda g: g.groupby("one",as_index=False)["two"].transform("max"))
 .two.unstack(level=1))

您可以将
df1
的列值添加到
df1
中,以获得要对其进行
groupby

df2.stack().groupby(
    df1.add(df1.columns.to_series()).stack()
).transform('max').unstack()

            foo  bar
2017-01-01    6    9
2017-01-02    6    9
2017-01-03    7    9
2017-01-04    7    5
2017-01-05    7    5
2017-01-06    7    5
解释非字符串

df2.stack().groupby(
    df1.astype(str).add(df1.columns.to_series().astype(str)).stack()
).transform('max').unstack()

沃瑟。这很有帮助,而且确实完成了工作,但不够简洁。有没有人有一个需要较少心理训练的替代方案?这很好。它的健壮性不太好,但我相信如果列标签是int而不是str,它会抛出ValueError。