#python #pandas
Вопрос:
Итак, у меня есть забавная проблема. У меня есть некоторые данные, в которых есть забавный вложенный словарь, которым мне нужно манипулировать, но у меня возникли проблемы. Я могу сделать это на чистом python, но хотел сделать все решение в Pandas, чтобы код был немного чище и не приходилось повторно открывать одни и те же файлы в другом месте.
Фрейм данных:
Id Timezone Data
957643 Pacific {"California":{"city":"San Francisco","pop":"874961"}}
973472 Eastern {"New York":{"city":"New York","pop":"8419000"}}
Желаемый вывод, список словарей, размещение идентификатора и часового пояса во вложенном словаре при обертывании каждого в другой ключ, чтобы я мог просто выводить как JSON:
[{"State Date":{"California":{"City":"San Francisco","Population":"874961","Id":"957643","Timezone":"Pacific"}}}, {"State Date":"New York":{"City":"New York","Population":"8419000", "Id":"973472","Timezone":"Eastern"}}}]
Проблема в том, что мне нужно, чтобы окончательный формат данных был принят в другом месте, поместить часовой пояс и идентификатор во вложенную часть каждой строки, которая будет экспортирована в JSON, и переименовать некоторые поля. Я попробовал метод iterrows и применил его с осью 1, но в итоге он помещает все идентификаторы и часовые пояса в каждый словарь, хотя и помещает их в гнездо.
Вариант ниже работает на чистом python при чтении всего CSV, но не в Панд (по причинам, которые, вероятно, очевидны для большинства). Для краткости, это строки, которые меня интересуют, поэтому я отбрасываю любые другие.
output = []
entry = {}
for id_, time, data in the_states.iterrows():
for state, other in data.items():
entry['Id'] = id_
entry['City'] = data.get('city')
entry['Timezone'] = time
entry['Population'] = data.get('pop')
output.append({'State Data': entry})
Любая помощь будет признательна.
Ответ №1:
В одну сторону:
- Создайте еще
list of dict
один viato_dict('records')
. zip
иiterate
над обоимиlist of dict
.Update
1 — й один с другим, чтобы получить желаемоеJSON
.
result = []
for i,j in zip(df.Data,df[['Id', 'Timezone']].to_dict('records')):
for key in i.keys():
i[key] = {**i[key], **j}
result.append({'state_data': i})
выход:
[{'state_data': {'California': {'city': 'San Francisco',
'pop': '874961',
'Id': 957643,
'Timezone': 'Pacific'}}},
{'state_data': {'New York': {'city': 'New York',
'pop': '8419000',
'Id': 973472,
'Timezone': 'Eastern'}}}]
Полный Пример:
df = pd.DataFrame({'Id': {0: 957643, 1: 973472},
'Timezone': {0: 'Pacific', 1: 'Eastern'},
'Data': {0: {"California":{"city":"San Francisco","pop":"874961"}},
1: {"New York":{"city":"New York","pop":"8419000"}}}})
result = []
for i,j in zip(df.Data,df[['Id', 'Timezone']].to_dict('records')):
for key in i.keys():
i[key] = {**i[key], **j}
result.append({'state_data': i})