请耐心等待我,因为我是python的新手。我正在迭代数据并获得我需要组合成一个pandas数据帧的多个列表。
然后我需要添加标题,以便我可以执行计算。
问题是每个项目都被视为一个单独的实体。请帮忙
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]
这是所需的输出数据框,标题为“name”,“id_a”,“id_b”和“income”:
name id_a id_b income
mike 1 4 20000
mary 2 5 30000
jane 3 6 40000
答案 0 :(得分:0)
您可以在循环外创建变量person_info
并在每次迭代中附加tuple
:
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')
答案 1 :(得分:0)
您还可以尝试使用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)
答案 2 :(得分:0)
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