如何根据两个数据框的两列之间的关系获得匹配的 2 个数据框
How to get 2 data frames matched based on relation between two columns of the two dataframe
我有两个数据框,数据格式为
Date Col1 Col2 Col3
1/1/2021 a b c
2/1/2021 d e f
3/1/2021 g h 1
Date Col4 Col5 Col6
1/1/2021 a b c
2/1/2021 d e f
3/1/2021 g h i
我有一个关系说
Cola Colb
Col1 Col4
Col2 Col5
Col3 Col6
我想要实现的是
Date Cola Colb
1/1/2021 a a
2/1/2021 d d
3/1/2021 g g
1/1/2021 b b
2/1/2021 e e
3/1/2021 h h
1/1/2021 c c
2/1/2021 f f
3/1/2021 l l
我的原计划是使用unpivot the initial data frame并使用merge来获取数据,但由于数据集很大,这不是一个可行的选择。谁能建议一种基于列之间的关系组合数据框的有效方法?
您可以转换 mapper_df
:
Cola Colb
0 Col1 Col4
1 Col2 Col5
2 Col3 Col6
到字典并修改df2
的列名。然后 stack
DataFrames 和 join
on "Date":
d = mapper_df.set_index('Cola')['Colb'].to_dict()
df2.columns = df2.columns.map({k: d.get(k, k) for k in df2.columns})
out = df1.set_index('Date').stack().to_frame().join(df2.set_index('Date').stack().to_frame(), lsuffix='_Cola', rsuffix='_Colb').droplevel(1)
out = out.rename(columns={c:c.split('_')[1] for c in out.columns})
输出:
Cola Colb
Date
1/1/2021 a a
1/1/2021 b b
1/1/2021 c c
2/1/2021 d d
2/1/2021 e e
2/1/2021 f f
3/1/2021 g g
3/1/2021 h h
3/1/2021 1 i
我有两个数据框,数据格式为
Date Col1 Col2 Col3
1/1/2021 a b c
2/1/2021 d e f
3/1/2021 g h 1
Date Col4 Col5 Col6
1/1/2021 a b c
2/1/2021 d e f
3/1/2021 g h i
我有一个关系说
Cola Colb
Col1 Col4
Col2 Col5
Col3 Col6
我想要实现的是
Date Cola Colb
1/1/2021 a a
2/1/2021 d d
3/1/2021 g g
1/1/2021 b b
2/1/2021 e e
3/1/2021 h h
1/1/2021 c c
2/1/2021 f f
3/1/2021 l l
我的原计划是使用unpivot the initial data frame并使用merge来获取数据,但由于数据集很大,这不是一个可行的选择。谁能建议一种基于列之间的关系组合数据框的有效方法?
您可以转换 mapper_df
:
Cola Colb
0 Col1 Col4
1 Col2 Col5
2 Col3 Col6
到字典并修改df2
的列名。然后 stack
DataFrames 和 join
on "Date":
d = mapper_df.set_index('Cola')['Colb'].to_dict()
df2.columns = df2.columns.map({k: d.get(k, k) for k in df2.columns})
out = df1.set_index('Date').stack().to_frame().join(df2.set_index('Date').stack().to_frame(), lsuffix='_Cola', rsuffix='_Colb').droplevel(1)
out = out.rename(columns={c:c.split('_')[1] for c in out.columns})
输出:
Cola Colb
Date
1/1/2021 a a
1/1/2021 b b
1/1/2021 c c
2/1/2021 d d
2/1/2021 e e
2/1/2021 f f
3/1/2021 g g
3/1/2021 h h
3/1/2021 1 i