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

Из df2['currencies'][0] я хочу извлечь значение codeAFN и передать его в df2['c_codes'][0]
Точно так же, если для строки есть несколько значений code, например df2['currencies'][8] , я хочу извлечь список значений code['AUD','GBP'] и передать список в df2['c_codes][8]
Каждая запись в c_codes может быть списком для этой цели.
Вот мой код:

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






Вот как бы я решил вашу проблему, учитывая, что все понял правильно:
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'}]]})
Было бы здорово предоставить ваши
DataFrameв виде текста, а не изображения. Спасибо