Панды: как сопоставить значения в столбце списков?

Столбец в фрейме данных 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  ]
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
7 558
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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]

Что, если я хочу сохранить все значения в списке и заменить их только при наличии сопоставления?

Fighter 19.12.2019 02:07
Ответ принят как подходящий

Использование вложенного списка и поиска по словарю:

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])

piRSquared 10.09.2018 05:54

Что, если я хочу сохранить все значения в списке и заменить их только при наличии сопоставления?

Fighter 19.12.2019 02:07

Вы можете использовать лямбда-функцию и для каждого списка строк применить функцию карты для получения значений словаря.

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

Что, если я хочу сохранить все значения в списке и заменить их только при наличии сопоставления?

Fighter 19.12.2019 02:07

Другие вопросы по теме