복붙노트

[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. ==============================

    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]
    
  2. from https://stackoverflow.com/questions/21494030/create-a-pandas-dataframe-from-deeply-nested-json by cc-by-sa and MIT license