Замените грязный str на чистый str с другого кадра данных - PullRequest
1 голос
/ 23 мая 2019

У меня есть 2 набора данных, и я хочу очистить df1 ['Fruits'], если он содержит строку df2 ['Fruits']

df1
Name    Fruits
--------------
Dina    Pineapple, [Y*]
Maria   PTC*, Apple
Johny   Durian, 1-6
Johny   5,6 Rambutan
Maria   Apple (Red), [Y] *
Dina    [Y] *, Peach88
Dina    Kiwi/Qiwi, PS*

df2
Fruits      tag
-------------
Apple       20
Pineapple   30
Rambutan    40
Durian      50
Apple (Red) 25
Peach88     55
Kiwi/Qiwi   25

Я пробовал

df1.loc[df1['Fruits'].contains(df2['Fruits']),'Fruits'] = df2['Fruits']

но он показывает

Объект 'Series' не имеет атрибута 'содержит'

Так что я ожидал получить

df1
Name    Fruits
--------------
Dina    Pineapple
Maria   Apple
Johny   Durian
Johny   Rambutan
Maria   Apple (Red)
Dina    Peach88
Dina    Kiwi/Qiwi

1 Ответ

2 голосов
/ 23 мая 2019

Использование pandas.Series.str.extract:

reg = '(%s)' % '|'.join(df2['Fruits'])
# Make regex expression using df2['Fruits']
df1['Fruits'] = df1['Fruits'].str.extract(reg)

Выход:

    Name     Fruits
0   Dina  Pineapple
1  Maria      Apple
2  Johny     Durian
3  Johny   Rambutan

Объяснение '(%s)' % '|'.join(df2['Fruits']):

  • '|'.join(df2['Fruits']): создает | разделенных слов для операции or в регулярном выражении. Возвращает Pineapple|Apple|Durian|Rambutan
  • (%s) % ...: это называется форматирование строки и эквивалент:
    • str.format: '({})'.format('|'.join(df2['Fruits'])),
    • или более неявный (но менее питонический) '(' + '|'.join(df2['Fruits']) + ')'
    • все из которых возвращает (Apple|Pineapple|Rambutan|Durian), группа захвата , обязательное для pd.Series.str.extract, чтобы знать, что извлечь.
...