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。