我想遍历一个JSON文件,并通过遍历JSON数据的特定键值来填充一个pandas DataFrame。
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:
df = pd.DataFrame(json_data, columns=['name', 'address', 'age'])我编写了一个for循环来迭代json_data并将数据添加到df_new
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值的数据。如果有人能帮助我解决这个问题,我将不胜感激。
发布于 2021-04-20 03:30:35
迭代通过json文件可能不是完成此任务的最佳方式。如果我是你,我会调查pd.json_normalize:
>>> 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在此之后,您可以根据需要重命名列,例如
df.columns = ["name", "age", "street", "city"]修复代码的
我不推荐使用这种方法,但为了解决您关于迭代json的特定问题:您可以使用以下命令获取数据帧:
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中有不一致的结构记录(例如,缺少所需的键之一),则此操作不会失败。
发布于 2021-04-20 07:47:46
在创建数据帧之前,在迭代时使用collections.defaultdict来整理数据应该比使用json.normalize更有效
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']})创建数据帧:
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的摘要,如果是密钥,则使用.访问;如果是阵列,则使用[]访问
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 Yorkhttps://stackoverflow.com/questions/67168079
复制相似问题