Панды объединяют DataFrame на точное и частичное совпадение - PullRequest
1 голос
/ 19 сентября 2019

Я хочу объединить два DataFrames для точного совпадения в столбце Name и частичного совпадения между ID и String.Вот пример:

Первый 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

1 Ответ

1 голос
/ 19 сентября 2019

Я думаю, что вы пытаетесь достичь слияния на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...