У меня есть DataFrame df2
со столбцами currencies
и c_codes
.
Каждая строка в столбце currencies
представляет собой список из одного или нескольких словарей. Я хочу извлечь значение для ключа code
в каждом словаре в каждом списке в каждой строке currencies
и передать значения code
в другой столбец DataFrame c_codes
Дело в точке:
Из df2['currencies'][0]
я хочу извлечь значение code
AFN
и передать его в 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
в виде текста, а не изображения. Спасибо