[PYTHON] 심하게 중첩 된 JSON에서 팬더 데이터 프레임 만들기
PYTHON심하게 중첩 된 JSON에서 팬더 데이터 프레임 만들기
깊게 중첩 된 JSON 문자열에서 단일 팬더 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 ...
첫 번째 열은 피벗 값이며 나머지 열은 목록 계열에 저장된 interval_id 및 p_value 키의 값입니다.
지금까지 나는
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 객체는 단순히 반환합니다.
<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...
.
.
.
어떻게하면 해당 시리즈 목록을 반복하여 dict 값으로 이동하고 N 개의 개별 열을 만들 수 있습니까? 시리즈 목록에 대한 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을 반환합니다. 개인이 행이 아닌 열이되도록 전치했습니다.
해결법
-
==============================
1.반복되는 열 이름을 얻는 방식으로 데이터를 구성하면 나중에 길을 잃을 때 두통이 생길 것입니다. IMHO는 각 피벗, interval_id 및 p_value에 대한 열을 만드는 것이 더 좋습니다. 이렇게하면 팬더에 데이터를로드 한 후 데이터를 매우 쉽게 쿼리 할 수 있습니다.
반복되는 열 이름을 얻는 방식으로 데이터를 구성하면 나중에 길을 잃을 때 두통이 생길 것입니다. IMHO는 각 피벗, interval_id 및 p_value에 대한 열을 만드는 것이 더 좋습니다. 이렇게하면 팬더에 데이터를로드 한 후 데이터를 매우 쉽게 쿼리 할 수 있습니다.
또한 JSON에 오류가 있습니다. 나는 이것을 통해 오류를 발견했다.
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 ()를 호출하여 중복 행을 제거 할 수 있습니다. 이것은 준다.
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]
from https://stackoverflow.com/questions/21494030/create-a-pandas-dataframe-from-deeply-nested-json by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] PyCharm에서 Python 2 코드를 3으로 변환 (0) | 2018.11.24 |
---|---|
[PYTHON] 파이썬에서 유니 코드 코드 포인트를 UTF8 16 진수로 변환 (0) | 2018.11.24 |
[PYTHON] Python : Excel 2007+ 파일 (.xlsx 파일)에 쓰기 (0) | 2018.11.24 |
[PYTHON] 프로그램을 실행하면 Tkinter 버튼 명령이 활성화됩니까? (0) | 2018.11.24 |
[PYTHON] 부스트 파이썬 안녕 프로그램에서 가져 오기 오류 (0) | 2018.11.24 |