Python 从深度嵌套的JSON创建数据帧
我试图从一个嵌套很深的JSON字符串创建一个Pandas DataFrame对象 JSON模式是:Python 从深度嵌套的JSON创建数据帧,python,json,pandas,Python,Json,Pandas,我试图从一个嵌套很深的JSON字符串创建一个Pandas DataFrame对象 JSON模式是: {"intervals": [ { pivots: "Jane Smith", "series": [ { "interval_id": 0, "p_value": 1 }, { "interval_id": 1, "p_value": 1.1162791357932633e-8 },
{"intervals": [
{
pivots: "Jane Smith",
"series": [
{
"interval_id": 0,
"p_value": 1
},
{
"interval_id": 1,
"p_value": 1.1162791357932633e-8
},
{
"interval_id": 2,
"p_value": 0.0000028675012051504467
}
],
},
{
"pivots": "Bob Smith",
"series": [
{
"interval_id": 0,
"p_value": 1
},
{
"interval_id": 1,
"p_value": 1.1162791357932633e-8
},
{
"interval_id": 2,
"p_value": 0.0000028675012051504467
}
]
}
]
}
所需结果我需要将其展平以生成表格:
Actor Interval_id Interval_id Interval_id ...
Jane Smith 1 1.1162 0.00000 ...
Bob Smith 1 1.1162 0.00000 ...
第一列是枢轴
值,其余列是存储在列表系列
中的键interval\u id
和p\u值
的值
到目前为止,我已经
import requests as r
import pandas as pd
actor_data = r.get("url/to/data").json['data']['intervals']
df = pd.DataFrame(actor_data)
actor\u data
是一个列表,其中长度等于个人数量,即pivots.values()
。df对象只是返回
<bound method DataFrame.describe of pivots Series
0 Jane Smith [{u'p_value': 1.0, u'interval_id': 0}, {u'p_va...
1 Bob Smith [{u'p_value': 1.0, u'interval_id': 0}, {u'p_va...
.
.
.
这给了我一个列表。现在我需要弄清楚如何将每个列表添加为数据帧中的一行
value_list = []
for i in pvalue_list:
pvs = [j['p_value'] for j in i]
value_list = value_list.append(pvs)
return value_list
这将返回一个非类型
解决方案
def get_hypthesis_data():
raw_data = r.get("/url/to/data").json()['data']
actor_dict = {}
for actor_series in raw_data['intervals']:
actor = actor_series['pivots']
p_values = []
for interval in actor_series['series']:
p_values.append(interval['p_value'])
actor_dict[actor] = p_values
return pd.DataFrame(actor_dict).T
这将返回正确的数据帧。我将其转换为行而不是列 我认为,以产生重复列名的方式组织数据只会给以后的工作带来麻烦。更好的方法是为每个
枢轴
、间隔id
和p\u值
创建一列。这将使在将数据加载到pandas中后查询数据变得非常容易
另外,JSON中也有一些错误。我仔细检查了一遍以找出错误
这里有帮助
import sh
jq = sh.jq.bake('-M') # disable colorizing
json_data = "from above"
rule = """[{pivots: .intervals[].pivots,
interval_id: .intervals[].series[].interval_id,
p_value: .intervals[].series[].p_value}]"""
out = jq(rule, _in=json_data).stdout
res = pd.DataFrame(json.loads(out))
这将产生类似于
interval_id p_value pivots
32 2 2.867501e-06 Jane Smith
33 2 1.000000e+00 Jane Smith
34 2 1.116279e-08 Jane Smith
35 2 2.867501e-06 Jane Smith
36 0 1.000000e+00 Bob Smith
37 0 1.116279e-08 Bob Smith
38 0 2.867501e-06 Bob Smith
39 0 1.000000e+00 Bob Smith
40 0 1.116279e-08 Bob Smith
41 0 2.867501e-06 Bob Smith
42 1 1.000000e+00 Bob Smith
43 1 1.116279e-08 Bob Smith
改编自
当然,您可以随时调用res.drop_duplicates()
删除重复行。这给
In [175]: res.drop_duplicates()
Out[175]:
interval_id p_value pivots
0 0 1.000000e+00 Jane Smith
1 0 1.116279e-08 Jane Smith
2 0 2.867501e-06 Jane Smith
6 1 1.000000e+00 Jane Smith
7 1 1.116279e-08 Jane Smith
8 1 2.867501e-06 Jane Smith
12 2 1.000000e+00 Jane Smith
13 2 1.116279e-08 Jane Smith
14 2 2.867501e-06 Jane Smith
36 0 1.000000e+00 Bob Smith
37 0 1.116279e-08 Bob Smith
38 0 2.867501e-06 Bob Smith
42 1 1.000000e+00 Bob Smith
43 1 1.116279e-08 Bob Smith
44 1 2.867501e-06 Bob Smith
48 2 1.000000e+00 Bob Smith
49 2 1.116279e-08 Bob Smith
50 2 2.867501e-06 Bob Smith
[18 rows x 3 columns]
list.append
方法不会返回任何东西(因为所有Python函数都返回了一些东西,所以它会返回None
),因为它会在原地更新列表。只需删除value\u list=
,您的列表就会得到正确更新。哇,使用jq
真是太棒了!我感觉我越来越近了。如果我将jq
规则更改为rule=“”[.interval[].series]”“
,这将允许我构建具有正确nxk维度的数据帧。问题是,每个单元格都是一个dict,例如{u'p_value':1,u'interval_id':0}
而不仅仅是p\u值的值
。DataFrame
应该不会有问题。有没有办法更改单元格的值,使它们只包含p\u值的值
,而不包含整个字典?我不确定你的意思。你能给我一个你在说什么的例子吗?@Anton:不确定自2014年初以来发生了什么变化,但据我所知,jq
不接受字符串作为命令行参数。相反,您可以创建一个cat=sh.cat
,然后将其导入jq
:jq(cat(\u in=json\u data),rule).stdout
。看见
In [175]: res.drop_duplicates()
Out[175]:
interval_id p_value pivots
0 0 1.000000e+00 Jane Smith
1 0 1.116279e-08 Jane Smith
2 0 2.867501e-06 Jane Smith
6 1 1.000000e+00 Jane Smith
7 1 1.116279e-08 Jane Smith
8 1 2.867501e-06 Jane Smith
12 2 1.000000e+00 Jane Smith
13 2 1.116279e-08 Jane Smith
14 2 2.867501e-06 Jane Smith
36 0 1.000000e+00 Bob Smith
37 0 1.116279e-08 Bob Smith
38 0 2.867501e-06 Bob Smith
42 1 1.000000e+00 Bob Smith
43 1 1.116279e-08 Bob Smith
44 1 2.867501e-06 Bob Smith
48 2 1.000000e+00 Bob Smith
49 2 1.116279e-08 Bob Smith
50 2 2.867501e-06 Bob Smith
[18 rows x 3 columns]