pandas 如何根据或条件合并2个 Dataframe

uqdfh47h  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(161)

我有两个DF,ABC和LOP。ABC:有很多列,其中有三个关键列,称为[A]、[B]、[C] LOP:有很多列,其中有一个键列称为[L]

ABC_data = [['A001', 'B001','C001','xxx','nnn'], ['A002', 'B002','C002','yyy','mmm'], ['A003', 'B003','C003','zzz','ooo']] 
ABC = pd.DataFrame(ABC_data, columns = ['A', 'B','C','Other_1','Other_2']) 
print(ABC)

 A     B     C Other_1 Other_2
0  A001  B001  C001     xxx     nnn
1  A002  B002  C002     yyy     mmm
2  A003  B003  C003     zzz     ooo

ABC_data

LOP_data = [['A002','sth1'], ['B004','sth2'], ['C002','sth3'], ['C003','sth4']] 
LOP = pd.DataFrame(LOP_data, columns = ['L', 'other_info']) 
print(LOP)

  L other_info
0  A002       sth1
1  B004       sth2
2  C002       sth3
3  C003       sth4

LOP _data

    • 我想要的**:我想做左连接,ABC作为左df,LOP作为右df。基于[L]中的值是否等于[A][B][C]。

注意:[L]只能等于[A]、[B]、[C]中的一个,这意味着它不会同时等于[A]和[B]
如果等于,则左连接所有LOP列中的值如果没有[L]值匹配[A]或[B]或[C],则将为null

    • 结果应该是这样的:**
A     B     C Other_1 Other_2     L L_other_info
0  A001  B001  C001     xxx     nnn  None         None
1  A002  B002  C002     yyy     mmm  A002         sth1
2  A002  B002  C002     yyy     mmm  C002         sth3
3  A003  B003  C003     zzz     ooo  C003         sth4

Result

    • 我努力**

1.我试过合并函数,但它只能做AND,但我必须做OR
1.我试着把ABC表分成三份,第一份让[B]和[C]为NULL,第二份让[A]和[C]为NULL,第三份让[A]和[B]为NULL。然后将它们分别与LOP合并,并将3个df合并。但是我在删除行时遇到了麻烦,因为如果我删除所有[L]都是NULL值的行,它将删除case [there is no L match ABC],但是我想保留这些NULL并删除3df中的重复项,所以我失败了

mrphzbgm

mrphzbgm1#

你可以在合并前.melt()

df_m = (
   ABC.reset_index()
      .melt(id_vars=['index', 'Other_1', 'Other_2'], value_name='L')
      .merge(LOP, on='L', how='left') 
      .dropna()
      .set_index('index')
)
Other_1 Other_2 variable     L other_info
index
1         yyy     mmm        A  A002       sth1
1         yyy     mmm        C  C002       sth3
2         zzz     ooo        C  C003       sth4

然后,您可以使用索引将其合并回来:

ABC.merge(
    df_m[['L', 'other_info']], 
    left_index=True, 
    right_index=True, 
    how='left'
)
A     B     C Other_1 Other_2     L other_info
0  A001  B001  C001     xxx     nnn   NaN        NaN
1  A002  B002  C002     yyy     mmm  A002       sth1
1  A002  B002  C002     yyy     mmm  C002       sth3
2  A003  B003  C003     zzz     ooo  C003       sth4

相关问题