【问题标题】:Pandas merge a DataFrame on an exact and partial match [duplicate]Pandas 在完全匹配和部分匹配上合并 DataFrame [重复]
【发布时间】:2020-01-20 11:57:16
【问题描述】:

我想在Name 列上的完全匹配和IDString 之间的部分匹配上合并两个DataFrame。这是一个例子:

第一个 DataFrame (df1) 如下所示:

Name ID    Tag
AAA  1111  XYZ
AAA  1122  DEF
BBB  2222  PQR
BBB  2211  MNL
CCC  3333  STU
CCC  3311  JKL
DDD  4444  ABC

第二个DataFrame(df2)是这样的;

String        Name
aasd1111dasd  AAA
sdf1122sdf    AAA 
sdffgs2222f   BBB
fsfg3333sdf   CCC
sefg4444sdf   DDD

我想要的是加入以下内容:

String        Name  Tag
aasd1111dasd  AAA   XYZ
sdf1122sdf    AAA   DEF
sdffgs2222f   BBB   PQR
fsfg3333sdf   CCC   STU 
sefg4444sdf   DDD   ABC

【问题讨论】:

  • 输出的逻辑是什么? sdf1122sdf 是从哪里来的?
  • 好像加入了ID和String的内容
  • 即使读了5分钟,我也无法得到输出的逻辑
  • 第二行的结果有错误吗?如果你没有第二行,这是有道理的
  • sdf1122sdf AAA 是不是在 df2 中丢失了这一行?

标签: python pandas join


【解决方案1】:

我认为您想要实现的是合并 Name,然后只保留 ID 在字段 String 中的行。

使用:

# df
    Name   ID  Tag
0   AAA  1111  XYZ
1   AAA  1122  DEF
2   BBB  2222  PQR
3   BBB  2211  MNL
4   CCC  3333  STU
5   CCC  3311  JKL
6   DDD  4444  ABC

# df2
          String  Name
0   aasd1111dasd   AAA
1     sdf1122sdf   AAA  # This line needed to be added to df2
2    sdffgs2222f   BBB
3    fsfg3333sdf   CCC
4    sefg4444sdf   DDD

合并:

m = df.merge(df2)

创建一个蒙版:

mask = m.apply(lambda x: str(x["ID"]) in x["String"], axis=1)

按掩码过滤:

m = m[mask][["String", "Name", "Tag"]]

输出:

         String Name  Tag
0  aasd1111dasd  AAA  XYZ
3    sdf1122sdf  AAA  DEF
4   sdffgs2222f  BBB  PQR
6   fsfg3333sdf  CCC  STU
8   sefg4444sdf  DDD  ABC

【讨论】:

    猜你喜欢
    • 2019-02-28
    • 2021-03-13
    • 2020-01-11
    • 1970-01-01
    • 2021-12-22
    • 2012-03-26
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多