使用带有不一致嵌套列表/字典的panda规范化json

clj7thdc  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(120)

I've been using pandas' json_normalize for a bit but ran into a problem with specific json file, similar to the one seen here: https://github.com/pandas-dev/pandas/issues/37783#issuecomment-1148052109
我试图找到一种方法来检索Ats-〉Ats dict中的数据,并将任何空值(如ID:101条目中看到的值)作为NaN值返回到 Dataframe 中。忽略json_normalize调用中的错误并不能防止试图迭代空值所导致的TypeError。
任何建议或方法,以接收一个有效的 Dataframe 的数据与这种结构是非常赞赏!

import json
import pandas as pd

data = """[
    {
        "ID": "100",
        "Ats": {
            "Ats": [
                {
                    "Name": "At1",
                    "Desc": "Lazy At"
                }
            ]
        }
    },
    {
        "ID": "101",
        "Ats": null
    }
]"""
data = json.loads(data)
df = pd.json_normalize(data, ["Ats", "Ats"], "ID", errors='ignore')
df.head()
TypeError: 'NoneType' object is not iterable

我尝试遍历Ats字典,它对ID为100的数据正常工作,但对ID为101的数据不工作。我期望忽略函数中的错误以在 Dataframe 中返回NaN值,但却收到了尝试遍历空值的TypeError。
所需的输出如下所示:Dataframe

fdbelqdn

fdbelqdn1#

也许您可以正常地从data创建一个DataFrame(没有pd.json_normalize),然后将其转换为请求的形式:

import json

import pandas as pd

data = """\
[
    {
        "ID": "100",
        "Ats": {
            "Ats": [
                {
                    "Name": "At1",
                    "Desc": "Lazy At"
                }
            ]
        }
    },
    {
        "ID": "101",
        "Ats": null
    }
]"""

data = json.loads(data)

df = pd.DataFrame(data)
df["Ats"] = df["Ats"].str["Ats"]
df = df.explode("Ats")

df = pd.concat([df, df.pop("Ats").apply(pd.Series, dtype=object)], axis=1)
print(df)

图纸:

ID Name     Desc
0  100  At1  Lazy At
1  101  NaN      NaN
yxyvkwin

yxyvkwin2#

tryexcept中规范化,如果发现错误,则应使用NAN将新行追加到DataFrame。
示例:

data = json.loads(data)
df = pd.DataFrame()
for item in data:
    try:
        df = df.append(pd.json_normalize(item, ["Ats", "Ats"], "ID")) 
    except TypeError:
        df = df.append({"ID" : item["ID"], "Name": np.nan, "Desc": np.nan}, ignore_index=True)

print(df)

输出:

Name     Desc   ID
0  At1  Lazy At  100
1  NaN      NaN  101

相关问题