#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 исправил это.