Добавление во вложенный словарь в столбце в Pandas

#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:

В одну сторону:

  1. Создайте еще list of dict один via to_dict('records') .
  2. zip и iterate над обоими list of dict .
  3. 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})