将 json 读取为 Multiindex DataFrame

Posted

技术标签:

【中文标题】将 json 读取为 Multiindex DataFrame【英文标题】:Reading a json as Multiindex DataFrame 【发布时间】:2020-08-17 22:30:46 【问题描述】:

我有一个像这样组成的 json。

[
    
        "bi-document-identifier": "USA",
        "text": "I found somwthing Interesting",
        "relation_type": "ImportanceRelation",
        "annotation_type": "Opinionholder",
        "relation_start": 
            "annotatedtext": "We",
            "annotatedtext_represents": "OpinionHolder",
            "annotatedtext_startposition": 146,
            "annotatedtext_endposition": 148
        ,
        "relation_end": 
            "annotatedtext": "information",
            "annotatedtext_represents": "StanceTarget",
            "annotatedtext_startposition": 239,
            "annotatedtext_endposition": 250
        
    ,
    
        "bi-document-identifier": "USB",
        "text": "This is quite new to me",
        "relation_type": "ImportanceRelation",
        "annotation_type": "Opinionholder",
        "relation_start": 
            "annotatedtext": "Dr. A_PERSON",
            "annotatedtext_represents": "OpinionHolder",
            "annotatedtext_startposition": 0,
            "annotatedtext_endposition": 12
        ,
        "relation_end": 
            "annotatedtext": "MOA of CV risk reduction",
            "annotatedtext_represents": "StanceTarget",
            "annotatedtext_startposition": 29,
            "annotatedtext_endposition": 53
        
    
]

如何读取为多头数据帧。 pandas.read_json() 中的 orient 和 typ 选项给了我一些如下错误

TypeError: list indices must be integers or slices, not str

【问题讨论】:

【参考方案1】:

为什么不使用 pandas 的json_normalize

from pandas import json_normalize
df = json_normalize(data)
df.head(2)

否则,这似乎涵盖了您的特定用例:

Creating a multi-header table from JSON

【讨论】:

不错的快速解决方案。感谢分享!【参考方案2】:

read_json 开始,records 方向:

df = pd.read_json('Input.json', orient='records')

然后将两个 relation 列转换为“MultiIndexed”版本:

d =  tt: df[tt].apply(pd.Series) for tt in ['relation_start', 'relation_end'] 
wrk1 = pd.concat(d, axis=1, keys=d.keys())

添加的 MultiIndex 级别是 top 级别(relation_startrelation_end) 和源值中的索引键成为第二级。

第三步是将 4 个初始列转换为 MultiIndex 版本,但这 time 添加的级别是 second 级别,仅包含空字符串:

wrk2 = df.iloc[:, 0:4]
wrk2.columns = pd.MultiIndex.from_product([wrk2.columns, ['']])

最后要做的是将两个 wrk 数据帧(在索引上)合并:

result = wrk2.join(wrk1)

或者如果你想要更短的代码,不要创建 wrk1d 就足够了),然后放置 最终指令中的对应表达式:

result = wrk.join(pd.concat(d, axis=1, keys=d.keys()))

注意:在其他解决方案中提出的json_normalize 无疑更短, 但结果有 plain(单级)列索引。 据我了解,您只需要列上的 MultiIndex

【讨论】:

赞。我感谢你的努力。伟大的。感谢您的回答。

以上是关于将 json 读取为 Multiindex DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

pytorch+numpy+PIL将dat文件读取为图像

Boost.MultiIndex:有没有办法在两个进程之间共享对象?

Pandas MultiIndex(超过 2 个级别)DataFrame 到嵌套 Dict/JSON

使用 jQuery 读取 JSON URL

Pandas - 读取 MultiIndex 文件的特定列

将 MultiIndex 数据框重塑为表格格式