将 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_start 和 relation_end) 和源值中的索引键成为第二级。
第三步是将 4 个初始列转换为 MultiIndex 版本,但这 time 添加的级别是 second 级别,仅包含空字符串:
wrk2 = df.iloc[:, 0:4]
wrk2.columns = pd.MultiIndex.from_product([wrk2.columns, ['']])
最后要做的是将两个 wrk 数据帧(在索引上)合并:
result = wrk2.join(wrk1)
或者如果你想要更短的代码,不要创建 wrk1 (d 就足够了),然后放置 最终指令中的对应表达式:
result = wrk.join(pd.concat(d, axis=1, keys=d.keys()))
注意:在其他解决方案中提出的json_normalize
无疑更短,
但结果有 plain(单级)列索引。
据我了解,您只需要列上的 MultiIndex。
【讨论】:
赞。我感谢你的努力。伟大的。感谢您的回答。以上是关于将 json 读取为 Multiindex DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Boost.MultiIndex:有没有办法在两个进程之间共享对象?