将列表合并为数据框。

5

请容忍我,因为我是新手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]

这里是所需的输出,以数据框形式呈现,标题为“姓名”,“ID_A”,“ID_B”和“收入”:
name    id_a    id_b    income
mike    1       4       20000
mary    2       5       30000
jane    3       6       40000

以下解决方案有帮助吗?如果有的话,请随意接受或要求澄清。 - jpp
3个回答

1
Pandas可以直接接受一个字典列表。不要反对这一点,你只需要简单地提取列表中每个项目的'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
你可以在循环外创建变量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']))

使用列表推导式的解决方案:

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')

我现在想要操作数据框,然后将其转换回JSON并通过API进行发布。我该怎么做?请再容忍我的基础问题。例如:js = { "name" : "mike" "id_a" : "1" "id_b" : "4" "income" : 40000" } - nia4life
@nia4life - 关于基础问题没有问题。您需要与输入数据相同的格式吗? - jezrael
@nia4life - 我认为需要使用DataFrame.to_json,也许需要df.to_json(file, orient='records') - jezrael
然后从您的样本数据中获取 [{"name":"mike","id_a":1,"id_b":4,"income":20000},{"name":"mary","id_a":2,"id_b":5,"income":30000},{"name":"jane","id_a":3,"id_b":6,"income":40000}],这是您想要的吗? - jezrael

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)

太好了!它起作用了。我还建议尝试其他答案中提出的方法。祝你编码愉快。 - niraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接