Столбец в фрейме данных pandas содержит списки значений.
Используя словарь, я хотел бы создать новый столбец с сопоставленными значениями с помощью словаря, и для любых значений, которых нет в словаре, эти значения удаляются.
Вот минимальный пример:
Настройка фрейма данных
df = pd.DataFrame(data = { 'B': ['x', 'y', 'z']})
df.at[0, 'B'] = ['jki', 'gg4', 'k6k']
df.at[1, 'B'] = ['2f4', 'gg4', 'g24']
df.at[2, 'B'] = ['1k1', 'g24', '1k1', '2f4']
Результаты в
df
B
0 [jki, gg4, k6k]
1 [2f4, gg4, g24]
2 [1k1, g24, 1k1, 2f4]
Настройка словаря
conv = { 'jki': 1, 'gg4': 2, '2f4': 3 , 'g24':4, }
Если бы столбец не был списком, использовался бы этот код
df['MappedA'] = df.B.map(conv)
Но поскольку столбец содержит списки, этот код использовать нельзя.
Вот каким бы я хотел получить результат
B MappedA
0 [jki, gg4, k6k] [ 1 , 2 ]
1 [2f4, gg4, g24] [3, 2, 4]
2 [1k1, g24, 1k1, 2f4] [ 4 , 3 ]
Вы можете попробовать с apply
и lambda
:
df['MappedA'] = df.B.apply(lambda row: [conv[v] for v in row if conv.get(v)])
Выход:
B MappedA
0 [jki, gg4, k6k] [1, 2]
1 [2f4, gg4, g24] [3, 2, 4]
2 [1k1, g24, 1k1, 2f4] [4, 3]
Использование вложенного списка и поиска по словарю:
df.assign(mapped=[[conv[k] for k in row if conv.get(k)] for row in df.B])
B mapped
0 [jki, gg4, k6k] [1, 2]
1 [2f4, gg4, g24] [3, 2, 4]
2 [1k1, g24, 1k1, 2f4] [4, 3]
Поднятие некоторых элементов из @NagaKirandf.assign(mapped=[[*filter(None, map(conv.get, x))] for x in df.B])
Что, если я хочу сохранить все значения в списке и заменить их только при наличии сопоставления?
Вы можете использовать лямбда-функцию и для каждого списка строк применить функцию карты для получения значений словаря.
df.B.apply(lambda x:list(filter(None,map(conv.get,x))))
Из:
0 [1, 2]
1 [3, 2, 4]
2 [4, 3]
Name: B, dtype: object
Что, если я хочу сохранить все значения в списке и заменить их только при наличии сопоставления?
Что, если я хочу сохранить все значения в списке и заменить их только при наличии сопоставления?