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

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

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

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

ABC_data

  1. LOP_data = [['A002','sth1'], ['B004','sth2'], ['C002','sth3'], ['C003','sth4']]
  2. LOP = pd.DataFrame(LOP_data, columns = ['L', 'other_info'])
  3. print(LOP)
  4. L other_info
  5. 0 A002 sth1
  6. 1 B004 sth2
  7. 2 C002 sth3
  8. 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

    • 结果应该是这样的:**
  1. A B C Other_1 Other_2 L L_other_info
  2. 0 A001 B001 C001 xxx nnn None None
  3. 1 A002 B002 C002 yyy mmm A002 sth1
  4. 2 A002 B002 C002 yyy mmm C002 sth3
  5. 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()

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

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

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

相关问题