Как извлечь несколько значений из каждой строки DataFrame в Python?

У меня есть DataFrame df2 со столбцами currencies и c_codes.

Каждая строка в столбце currencies представляет собой список из одного или нескольких словарей. Я хочу извлечь значение для ключа code в каждом словаре в каждом списке в каждой строке currencies и передать значения code в другой столбец DataFrame c_codes

Дело в точке:

Как извлечь несколько значений из каждой строки DataFrame в Python?

Из df2['currencies'][0] я хочу извлечь значение codeAFN и передать его в df2['c_codes'][0]

Точно так же, если для строки есть несколько значений code, например df2['currencies'][8] , я хочу извлечь список значений code['AUD','GBP'] и передать список в df2['c_codes][8]

Каждая запись в c_codes может быть списком для этой цели.

Вот мой код:

Как извлечь несколько значений из каждой строки DataFrame в Python?

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

Однако код возвращает list_of_currencies пустым. Я пробовал играть с циклами, temp, списками и т. д., но он просто возвращает пустой список или список всех добавленных codes без подсписков.

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

Что я делаю не так? Есть ли более простой способ сделать это?

Было бы здорово предоставить ваши DataFrame в виде текста, а не изображения. Спасибо

HedgeHog 19.03.2022 14:49

Пожалуйста, не публикуйте изображения кода, так как это затрудняет вам помощь. Лучше попробуйте свести вашу проблему к минимальному примеру кода с указанием того, что пошло не так и каков ожидаемый результат.

richardec 19.03.2022 15:48
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот как бы я решил вашу проблему, учитывая, что все понял правильно:

import pandas

df = pandas.DataFrame({
    "x": ["A", "B", "C"],
    "currencies": [[{"code": "x"}, {"code": "y"}], [{"code": "u"}], [{"code": "v"}]]
})
print(df)
>    x                      currencies
  0  A  [{'code': 'x'}, {'code': 'y'}]
  1  B                 [{'code': 'u'}]
  2  C                 [{'code': 'v'}]


df["c_codes"] = df["currencies"].apply(lambda x: [i["code"] for i in x])
print(df)
>    x                      currencies c_codes
  0  A  [{'code': 'x'}, {'code': 'y'}]  [x, y]
  1  B                 [{'code': 'u'}]     [u]
  2  C                 [{'code': 'v'}]     [v]

Что делает этот метод apply, так это перебирает значения в currencies и применяет к ним лямбда-функцию: для каждого ввода (в данном случае списка диктов) возвращает список только значений каждого значения code. Затем эти результаты сохраняются в новый столбец c_codes.

Ответ принят как подходящий

Я думаю, вы можете использовать explode для расширения списка объектов и .str для получения значения code для векторизованного (читай: очень быстрого) решения:

df['c_codes'] = df['currencies'].explode().str['code'].groupby(level=0).agg(list).str.join(', ')

Вывод (на основе выборочных данных внизу этого ответа):

>>> df
                                                                                 currencies   c_codes
0                                               [{'code': 'AFN', 'name': 'Afghan afghani'}]       AFN
1                                                         [{'code': 'EUR', 'name': 'Euro'}]       EUR
2  [{'code': 'AUD', 'name': 'Australian dollar'}, {'code': 'GBP', 'name': 'British pound'}]  AUD, GBP
3                                        [{'code': 'XCD', 'name': 'East Carribean dollar'}]       XCD

Если вам нужны настоящие списки в столбце c_codes, а не просто строки, разделенные запятыми, просто опустите часть .str.join:

df['c_codes'] = df['currencies'].explode().str['code'].groupby(level=0).agg(list)

Выход:

>>> df
                                                                                 currencies     c_codes
0                                               [{'code': 'AFN', 'name': 'Afghan afghani'}]       [AFN]
1                                                         [{'code': 'EUR', 'name': 'Euro'}]       [EUR]
2  [{'code': 'AUD', 'name': 'Australian dollar'}, {'code': 'GBP', 'name': 'British pound'}]  [AUD, GBP]
3                                        [{'code': 'XCD', 'name': 'East Carribean dollar'}]       [XCD]

Пример данных для тестирования кода выше:

df = pd.DataFrame({'currencies': [
    [{'code':'AFN','name':'Afghan afghani'}],
    [{'code':'EUR','name':'Euro'}],
    [{'code':'AUD','name':'Australian dollar'},{'code':'GBP','name':'British pound'}],
    [{'code':'XCD','name':'East Carribean dollar'}]]})

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