Сравните строку с таблицей поиска и выполните замену

#python #pandas

#python #pandas

Вопрос:

Я хочу выполнить итерацию по строке значений в Python dataframe и сравнить каждое значение в этой строке с ключами в таблице поиска. Если она совпадает, мы заменяем значением из таблицы поиска.

Фрейм данных выглядит следующим образом:

 index   String
1       ['a','b','c']
2       ['d','e','f','g','h']
3       ['i','j']
  

Таблица поиска выглядит следующим образом:

 key  value
---  -----
a    apple
b    book
c    clock
d    duck
e    else
f    far
g    girl
h    hour
i    ink
j    juice
  

Ожидаемый результат должен выглядеть следующим образом:

 index   String
1      ['apple','book','clock']
2      ['duck','else','far','girl','hour']
3      ['ink','juice']
  

Я знаю, что я должен использовать isin() функцию, чтобы проверить, существует ли значение из первого столбца, но теперь у меня есть идея, как выполнить замену. Есть предложения?

Ответ №1:

Я вижу, что другие опередили меня, чтобы опубликовать ответы, но пока ни один из них не учитывает сценарий, в котором строка может отсутствовать в таблице поиска, о которой вы упомянули в своем вопросе. Приведенный ниже код использует условную проверку того, находится ли строка в таблице поиска, и оставляет строку неизменной, если она отсутствует.

 import pandas as pd

df = pd.DataFrame({"String": [['a', 'b', 'c'], ['d', 'e', 'f', 'g', 'h'], ['i', 'j'], ['k', 'l']]})
lookup = {'a': 'apple',
          'b': 'book',
          'c': 'clock',
          'd': 'duck',
          'e': 'else',
          'f': 'far',
          'g': 'girl',
          'h': 'hour',
          'i': 'ink',
          'j': 'juice'}

df['String'] = df['String'].apply(lambda string: [lookup[val] if val in lookup else val for val in string])
  

Результат:

                           String
0           [apple, book, clock]
1  [duck, else, far, girl, hour]
2                   [ink, juice]
3                         [k, l]
  

Ответ №2:

Попробуйте это:

 df = pd.DataFrame({'String': [['a','b','c'], ['d','e','f','g','h'], ['i','j']]})

mymap = {
'a':   'apple',
'b':    'book',
'c':    'clock',
'd':    'duck',
'e':    'else',
'f':    'far',
'g':    'girl',
'h':    'hour',
'i':    'ink',
'j':    'juice'
}

df['String'] = df['String'].apply(lambda x: [mymap.get(i) for i in x])

df
  

Вывод:

                           String
0           [apple, book, clock]
1  [duck, else, far, girl, hour]
2                   [ink, juice]
  

Ответ №3:

Должно работать следующее:

 my_dict=pd.Series(lookuptable.value.values,index=lookuptable.key).to_dict()
df.String=df.String.apply(lambda x:[my_dict[i] for i in x])
  

Ответ №4:

Это понимание списка должно работать, если таблица поиска является фреймом данных:

 df['String'].apply(lambda x: [z2 for y in x for z1, z2 in zip(df1['key'], df1['value']) if y == z1])
  

Смотрите полный код ниже:

 import pandas as pd
df = pd.DataFrame({'index': {0: 1, 1: 2, 2: 3},
 'String': {0: "['a','b','c']", 1: "['d','e','f','g','h']", 2: "['i','j']"}})

df1 = pd.DataFrame({'key': {0: 'a',
  1: 'b',
  2: 'c',
  3: 'd',
  4: 'e',
  5: 'f',
  6: 'g',
  7: 'h',
  8: 'i',
  9: 'j'},
 'value': {0: 'apple',
  1: 'book',
  2: 'clock',
  3: 'duck',
  4: 'else',
  5: 'far',
  6: 'girl',
  7: 'hour',
  8: 'ink',
  9: 'juice'}})

df2 = df.copy()    
df2['String'] = df['String'].replace(['[',']', '''], '', regex=True).str.split(',')
df2['String'] = df2['String'].apply(lambda x: [z2 for y in x for z1, z2 in zip(df1['key'], df1['value']) if y == z1])
# df2['String'] = df2['String'].apply(lambda x: ','.join(x))
df2
Out[1]: 
   index                         String
0      1           [apple, book, clock]
1      2  [duck, else, far, girl, hour]
2      3                   [ink, juice]
  

Комментарии:

1. df2 не определен

2. @Taie исправил это.