首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从JSON文件填充pandas DataFrame

从JSON文件填充pandas DataFrame
EN

Stack Overflow用户
提问于 2021-04-20 03:16:57
回答 2查看 94关注 0票数 0

我想遍历一个JSON文件,并通过遍历JSON数据的特定键值来填充一个pandas DataFrame。

代码语言:javascript
运行
复制
import pandas as pd
json_data = [
{
    "name" : "Brad Green",
    "age" : "35",
    "address" : {
        "street" : "Nicol St. 16",
        "city" : "Manhatan"
    },
    "children" : ["Nati", "Madi"]
},

{
    "name" : "Sara Brown",
    "age" : "30",
    "address" : {
        "street" : "Adam St. 66",
        "city" : "New York"
    },
    "children" : "none" 
}
]

我不想像下面的代码那样简单地将数据从json_data添加到df:

代码语言:javascript
运行
复制
df = pd.DataFrame(json_data, columns=['name', 'address', 'age'])

我编写了一个for循环来迭代json_data并将数据添加到df_new

代码语言:javascript
运行
复制
df_new = pd.DataFrame(columns=['name','age','street','city'])

for i in range(len(json_data)):
    df_new = df_new.append({"name": json_data[i]})
...

我知道这个for循环显然不能从json_data获取'name','age','street','city值,但我无法通过查看这里的不同帖子来找到解决方案。另外,我希望从这个嵌套的键值中单独获取来自address值的数据。如果有人能帮助我解决这个问题,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2021-04-20 03:30:35

迭代通过json文件可能不是完成此任务的最佳方式。如果我是你,我会调查pd.json_normalize

代码语言:javascript
运行
复制
>>> df = pd.json_normalize(json_data)[['name', 'age', 'address.street', 'address.city']] 
>>> df

         name age address.street address.city
0  Brad Green  35   Nicol St. 16     Manhatan
1  Sara Brown  30    Adam St. 66     New York

在此之后,您可以根据需要重命名列,例如

代码语言:javascript
运行
复制
df.columns = ["name", "age", "street", "city"]

修复代码的

我不推荐使用这种方法,但为了解决您关于迭代json的特定问题:您可以使用以下命令获取数据帧:

代码语言:javascript
运行
复制
df_new = pd.DataFrame(columns=['name','age','street','city'])

for kv in json_data2:
    df_new = df_new.append(
        {
            "name": kv.get("name", None),
            "age": kv.get("age", None),
            "street": kv.get("address", {}).get("street", None),
            "city": kv.get("address", {}).get("city", None),
        },
        ignore_index=True
    )

请注意,我使用的.get()的默认值为None,这样如果您的json中有不一致的结构记录(例如,缺少所需的键之一),则此操作不会失败。

票数 2
EN

Stack Overflow用户

发布于 2021-04-20 07:47:46

在创建数据帧之前,在迭代时使用collections.defaultdict来整理数据应该比使用json.normalize更有效

代码语言:javascript
运行
复制
from collections import defaultdict

df = defaultdict(list)

for entry in json_data:
     df['name'].append(entry['name'])
     df['age'].append(entry['age'])
     df['street'].append(entry['address']['street'])
     df['city'].append(entry['address']['city'])

df

defaultdict(list,
            {'name': ['Brad Green', 'Sara Brown'],
             'age': ['35', '30'],
             'street': ['Nicol St. 16', 'Adam St. 66'],
             'city': ['Manhatan', 'New York']})

创建数据帧:

代码语言:javascript
运行
复制
pd.DataFrame(df)
 
         name age        street      city
0  Brad Green  35  Nicol St. 16  Manhatan
1  Sara Brown  30   Adam St. 66  New York

您也可以使用jmespath,但我认为它过于夸张了,因为这里的json不是太嵌套的;我还是在这里添加它,以防您需要遍历嵌套的json数据。使用jmespath的摘要,如果是密钥,则使用.访问;如果是阵列,则使用[]访问

代码语言:javascript
运行
复制
import jmespath

df = jmespath.search("""{name:[].name, 
                         age: [].age, 
                         street: [].address.street, 
                         city: [].address.city}
                     """, 
                     json_data)

pd.DataFrame(df)
 
         name age        street      city
0  Brad Green  35  Nicol St. 16  Manhatan
1  Sara Brown  30   Adam St. 66  New York
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67168079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档