根据两列的条件比较 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

现在我需要从上面两个数据帧输出。

条件

  1. 需要在 STR2 中搜索 Ref.Y,如果可用,则选择输出的“类型”。
  2. 如果 Ref.Y 是“NA”,则需要在 STR1 中搜索 Ref.X,如果可用,则选择“类型”进行输出。
  3. 我还需要在所需输出中的“Ref.No”对应于在 DF2
  4. 中找到的“类型”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