我正在尝试从深度嵌套的JSON字符串创建单个Pandas DataFrame对象。
JSON模式是:
{"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 ...
第一列是Pivots值,其余列是键的值interval_id并p_value存储在列表中series。
Pivots
interval_id
p_value
series
到目前为止,我已经
import requests as r import pandas as pd actor_data = r.get("url/to/data").json['data']['intervals'] df = pd.DataFrame(actor_data)
actor_data是一个列表,其中长度等于个人数量,即pivots.values()。df对象只是返回
actor_data
pivots.values()
<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... . . .
如何遍历该series列表以获取dict值并创建N个不同的列?我应该尝试为该series列表创建一个DataFrame ,重塑它的形状,然后用角色名称绑定列吗?
更新:
pvalue_list = [i['p_value'] for i in json_data['series']]
这给了我一个清单清单。现在,我需要弄清楚如何将每个列表添加为DataFrame中的一行。
value_list = [] for i in pvalue_list: pvs = [j['p_value'] for j in i] value_list = value_list.append(pvs) return value_list
这将返回一个NoneType
解
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
这将返回正确的DataFrame。我对它进行了移调,因此个人是行而不是列。
我认为,以产生重复列名的方式组织数据只会在以后给您带来麻烦。更好的方法是恕我直言创造每一个列pivots,interval_id和p_value。将数据加载到熊猫中后,这将使查询数据变得非常容易。
pivots
另外,您的JSON中有一些错误。我通过它来查找错误。
jq 帮助这里
jq
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()以删除重复的行。这给
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]