Объединить список в датафрейм - PullRequest
0 голосов
/ 09 июня 2018

Потерпи меня, пока я новичок в питоне.Я перебираю данные и получаю несколько списков, которые мне нужно объединить в один кадр данных панд.

Затем мне нужно добавить заголовки, чтобы я мог выполнять вычисления.

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

for r in rows:
  person_info = list()
  person_info.append(r['metadata']['name'])
  person_info.append(r['metadata']['CountryId'])
  person_info.append(r['metadata']['StateId'])
  person_info.append(r['metadata']['Income'])
  print(person_info)

Вот вывод:

['mike' , 1, 4, 20000]
['mary', 2, 5, 30000]
['jane', 3, 6, 40000]

вот желаемый вывод в виде фрейма данных с заголовками «имя», «id_a», «id_b» и «доход»:

name    id_a    id_b    income
mike    1       4       20000
mary    2       5       30000
jane    3       6       40000

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Вы также можете попробовать использовать defaultdict и использовать его для создания dataframe:

from collections import defaultdict
import pandas as pd

person_info = defaultdict(list)

for r in rows:
    person_info['name'].append(r['metadata']['name'])
    person_info['id_a'].append(r['metadata']['CountryId'])
    person_info['id_b'].append(r['metadata']['StateId'])
    person_info['income'].append(r['metadata']['Income'])

Затем создайте фрейм данных:

df = pd.DataFrame(person_info)
0 голосов
/ 09 июня 2018

Pandas принимает список словарей напрямую.Не боритесь с этим, вы можете просто извлечь i['metadata'] для каждого элемента в вашем списке.

После этого ваша единственная задача - переименовать и отсортировать столбцы.

r = [{'metadata': {'name': 'mike', 'CountryId': 1, 'StateId': 4, 'Income': 20000}},
     {'metadata': {'name': 'mary', 'CountryId': 2, 'StateId': 5, 'Income': 30000}},
     {'metadata': {'name': 'jane', 'CountryId': 3, 'StateId': 6, 'Income': 40000}}]

df = pd.DataFrame([i['metadata'] for i in r])\
       .rename(columns={'CountryId': 'id_a', 'StateId': 'id_b', 'Income': 'income'})\
       .reindex(['name', 'id_a', 'id_b', 'income'], axis=1)

print(df)

   name  id_a  id_b  income
0  mike     1     4   20000
1  mary     2     5   30000
2  jane     3     6   40000
0 голосов
/ 09 июня 2018

Вы можете создать переменную person_info вне цикла и добавлять tuple s на каждой итерации:

person_info = list()
for r in rows:
  person_info.append((r['metadata']['name'], r['metadata']['CountryId'], r['metadata']['StateId'], r['metadata']['Income']))

Решение с list comprehension:

person_info = [(r['metadata']['name'], r['metadata']['CountryId'], r['metadata']['StateId'], r['metadata']['Income']) for r in rows]

df = pd.DataFrame(person_info, columns=["name", "id_a", "id_b", "income"]) 

Другое возможное решение, если ввод json - это использование json_normalize:

import json
from pandas.io.json import json_normalize    

with open('myJson.json') as data_file:    
    data = json.load(data_file)  

df = json_normalize(data, 'metadata')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...