需要在 Pandas -Python 中映射两个数据框
Need to Map two dataframe in Pandas -Python
我有两个数据框,我需要映射两个数据框中的不同列。共享两个数据框。
数据框:-
IN.Type STRA STRB STRC
CRBD 2487 XR XL0054
DFRS 3754 MY XL0684
CRBD 7356 DF XL8911
DFRS 4487 DF XL58999
DFRS 7785 MY XL76568
CRBD 8235 GL XL0635
DFRS 2468 PQ XL4569
DFRS 9735 GR XL7589
CRBD 6486 TY XL5566
DFRS 1023 PQ XL27952
Dataframe2 :-
REF1 REF2
2468 PQ
3754 MY
1023 PQ
9735 NA
2487 XR
7785 MY
7356 DF
8235 NA
6486 TY
4487 NA
需要什么:-
- 首先需要在Dataframe["STRB"]中搜索Dataframe2["REF2"],如果可用则选择
Dataframe["IN.Type"] 和 Dataframe["STRC"] 中对应的数据可用于输出
数据框。
- 其次如果Dataframe2["REF2"] == "NA"那么需要在Dataframe2["REF1"]中搜索
Dataframe["STRA"],如果可用,则选择相应的可用数据
Dataframe["IN.Type"] 和 Dataframe["STRC"] 用于输出数据帧。
- 第三种如果Dataframe2["REF2"]不在Dataframe["STRB"]中则直接把"NONE"输出
数据框“类型”列。
输出数据帧(样本):-
Type RTFN
CRBD XL0054
DFRS XL76568
NONE XL0635
- 从 Dataframe["IN.Type"] 获取的数据将进入 Output["Type"]。
- 从 Dataframe["STRC"] 获取的数据将进入输出 ["RFTN"]。
使用Series.isin
for filter both DataFrames and set values in DataFrame.loc
:
m1 = Dataframe["STRB"].isin(Dataframe2["REF2"])
m2 = Dataframe["STRA"].isin(Dataframe2.loc[Dataframe2["REF2"].isna(), "REF1"])
#if NA s string
#m2 = Dataframe["STRA"].isin(Dataframe2.loc[Dataframe2["REF2"].eq('NA'), "REF1"])
df = pd.concat([Dataframe.loc[(m1 | m2), ['IN.Type','STRC']].drop_duplicates('IN.Type'),
Dataframe.loc[~m1, ['IN.Type','STRC']].assign(**{'IN.Type':None})])
df.columns=['Type','RTFN']
print (df)
Type RTFN
0 CRBD XL0054
1 DFRS XL0684
5 None XL0635
7 None XL7589
我有两个数据框,我需要映射两个数据框中的不同列。共享两个数据框。
数据框:-
IN.Type STRA STRB STRC
CRBD 2487 XR XL0054
DFRS 3754 MY XL0684
CRBD 7356 DF XL8911
DFRS 4487 DF XL58999
DFRS 7785 MY XL76568
CRBD 8235 GL XL0635
DFRS 2468 PQ XL4569
DFRS 9735 GR XL7589
CRBD 6486 TY XL5566
DFRS 1023 PQ XL27952
Dataframe2 :-
REF1 REF2
2468 PQ
3754 MY
1023 PQ
9735 NA
2487 XR
7785 MY
7356 DF
8235 NA
6486 TY
4487 NA
需要什么:-
- 首先需要在Dataframe["STRB"]中搜索Dataframe2["REF2"],如果可用则选择 Dataframe["IN.Type"] 和 Dataframe["STRC"] 中对应的数据可用于输出 数据框。
- 其次如果Dataframe2["REF2"] == "NA"那么需要在Dataframe2["REF1"]中搜索 Dataframe["STRA"],如果可用,则选择相应的可用数据 Dataframe["IN.Type"] 和 Dataframe["STRC"] 用于输出数据帧。
- 第三种如果Dataframe2["REF2"]不在Dataframe["STRB"]中则直接把"NONE"输出 数据框“类型”列。
输出数据帧(样本):-
Type RTFN
CRBD XL0054
DFRS XL76568
NONE XL0635
- 从 Dataframe["IN.Type"] 获取的数据将进入 Output["Type"]。
- 从 Dataframe["STRC"] 获取的数据将进入输出 ["RFTN"]。
使用Series.isin
for filter both DataFrames and set values in DataFrame.loc
:
m1 = Dataframe["STRB"].isin(Dataframe2["REF2"])
m2 = Dataframe["STRA"].isin(Dataframe2.loc[Dataframe2["REF2"].isna(), "REF1"])
#if NA s string
#m2 = Dataframe["STRA"].isin(Dataframe2.loc[Dataframe2["REF2"].eq('NA'), "REF1"])
df = pd.concat([Dataframe.loc[(m1 | m2), ['IN.Type','STRC']].drop_duplicates('IN.Type'),
Dataframe.loc[~m1, ['IN.Type','STRC']].assign(**{'IN.Type':None})])
df.columns=['Type','RTFN']
print (df)
Type RTFN
0 CRBD XL0054
1 DFRS XL0684
5 None XL0635
7 None XL7589