根据两列的条件比较 pandas 的两个数据帧
Comparing Two dataframes of pandas on the basis of condition of two columns
我有两个列不同的数据框,我需要在新文件中搜索和映射数据。
我正在共享数据帧以及所需的输出
DF1
Ref.X Ref.Y Ref.No
255623 145244651 XF1234
45454544 NA DF7886
1300256655 3511614646 DF8948
5546446166 NA VX4578
1230001556 NA GL8947
4548754545 4548545877 DF7896
3652656 NA XF4895
7884045455 45681247 GL8597
148428 1242154661 XF3564
DF2
Type STR1 STR2
ABJH 45656644 145244651
ABJH 844654989 1242154661
BHJH 51654241654 3511614646
BHJH 1230001556 255565656
ABJH 5546446166 8946549849
ABJH 45454544 544895655
BHJH 3652656 565464447
现在我需要从上面两个数据帧输出。
条件
- 需要在 STR2 中搜索 Ref.Y,如果可用,则选择输出的“类型”。
- 如果 Ref.Y 是“NA”,则需要在 STR1 中搜索 Ref.X,如果可用,则选择“类型”进行输出。
- 我还需要在所需输出中的“Ref.No”对应于在 DF2
中找到的“类型”Ref.X 或 Ref.Y
期望的输出
Ref.X Ref.Y Ref.No Int_Type
255623 145244651 XF1234 ABJH
45454544 NA DF7886 ABJH
1300256655 3511614646 DF8948 BHJH
5546446166 NA VX4578 ABJH
1230001556 NA GL8947 BHJH
3652656 NA XF4895 BHJH
148428 1242154661 XF3564 ABJH
谢谢。
您可以尝试将 NA
字符串替换为 <NA>
类型,然后使用 np.where
df1 = df1.replace({'NA': pd.NA})
df1['Int_Type'] = np.where(df1['Ref.Y'].isna(),
df1['Ref.X'].map(dict(zip(df2['STR1'], df2['Type']))),
df1['Ref.Y'].map(dict(zip(df2['STR2'], df2['Type']))))
或者直接与NA
字符串比较:
df1['Int_Type'] = np.where(df1['Ref.Y'].eq('NA'),
Ref.X Ref.Y Ref.No Int_Type
0 255623 1.452447e+08 XF1234 ABJH
1 148428 1.242155e+09 XF3564 ABJH
2 1300256655 3.511615e+09 DF8948 BHJH
3 1230001556 NaN GL8947 BHJH
4 5546446166 NaN VX4578 ABJH
5 45454544 NaN DF7886 ABJH
6 3652656 NaN XF4895 BHJH
7 4548754545 4.548546e+09 DF7896 NaN
8 7884045455 4.568125e+07 GL8597 NaN
要使 Ref.No
对应于 DF2 中的“类型”Ref.X 或 Ref.Y,您可以删除 Int_Type
中的 NAN
列
df1 = df1.dropna(subset='Int_Type')
print(df1)
Ref.X Ref.Y Ref.No Int_Type
0 255623 1.452447e+08 XF1234 ABJH
1 148428 1.242155e+09 XF3564 ABJH
2 1300256655 3.511615e+09 DF8948 BHJH
3 1230001556 NaN GL8947 BHJH
4 5546446166 NaN VX4578 ABJH
5 45454544 NaN DF7886 ABJH
6 3652656 NaN XF4895 BHJH
我有两个列不同的数据框,我需要在新文件中搜索和映射数据。 我正在共享数据帧以及所需的输出
DF1
Ref.X Ref.Y Ref.No
255623 145244651 XF1234
45454544 NA DF7886
1300256655 3511614646 DF8948
5546446166 NA VX4578
1230001556 NA GL8947
4548754545 4548545877 DF7896
3652656 NA XF4895
7884045455 45681247 GL8597
148428 1242154661 XF3564
DF2
Type STR1 STR2
ABJH 45656644 145244651
ABJH 844654989 1242154661
BHJH 51654241654 3511614646
BHJH 1230001556 255565656
ABJH 5546446166 8946549849
ABJH 45454544 544895655
BHJH 3652656 565464447
现在我需要从上面两个数据帧输出。
条件
- 需要在 STR2 中搜索 Ref.Y,如果可用,则选择输出的“类型”。
- 如果 Ref.Y 是“NA”,则需要在 STR1 中搜索 Ref.X,如果可用,则选择“类型”进行输出。
- 我还需要在所需输出中的“Ref.No”对应于在 DF2 中找到的“类型”Ref.X 或 Ref.Y
期望的输出
Ref.X Ref.Y Ref.No Int_Type
255623 145244651 XF1234 ABJH
45454544 NA DF7886 ABJH
1300256655 3511614646 DF8948 BHJH
5546446166 NA VX4578 ABJH
1230001556 NA GL8947 BHJH
3652656 NA XF4895 BHJH
148428 1242154661 XF3564 ABJH
谢谢。
您可以尝试将 NA
字符串替换为 <NA>
类型,然后使用 np.where
df1 = df1.replace({'NA': pd.NA})
df1['Int_Type'] = np.where(df1['Ref.Y'].isna(),
df1['Ref.X'].map(dict(zip(df2['STR1'], df2['Type']))),
df1['Ref.Y'].map(dict(zip(df2['STR2'], df2['Type']))))
或者直接与NA
字符串比较:
df1['Int_Type'] = np.where(df1['Ref.Y'].eq('NA'),
Ref.X Ref.Y Ref.No Int_Type
0 255623 1.452447e+08 XF1234 ABJH
1 148428 1.242155e+09 XF3564 ABJH
2 1300256655 3.511615e+09 DF8948 BHJH
3 1230001556 NaN GL8947 BHJH
4 5546446166 NaN VX4578 ABJH
5 45454544 NaN DF7886 ABJH
6 3652656 NaN XF4895 BHJH
7 4548754545 4.548546e+09 DF7896 NaN
8 7884045455 4.568125e+07 GL8597 NaN
要使 Ref.No
对应于 DF2 中的“类型”Ref.X 或 Ref.Y,您可以删除 Int_Type
中的 NAN
列
df1 = df1.dropna(subset='Int_Type')
print(df1)
Ref.X Ref.Y Ref.No Int_Type
0 255623 1.452447e+08 XF1234 ABJH
1 148428 1.242155e+09 XF3564 ABJH
2 1300256655 3.511615e+09 DF8948 BHJH
3 1230001556 NaN GL8947 BHJH
4 5546446166 NaN VX4578 ABJH
5 45454544 NaN DF7886 ABJH
6 3652656 NaN XF4895 BHJH