簡體   English   中英

使用 Pandas 中的嵌套列表解壓縮 Json

[英]Unpacking Json with nested Lists in Pandas

我有一個 json 文件,我試圖解壓縮它,如下所示:

[{'batter': 'LA Marsh',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0}},
 {'batter': 'LA Marsh',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0},
  'wickets': [{'player_out': 'LA Marsh', 'kind': 'bowled'}]},
 {'batter': 'EA Perry',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0}}]

使用以下代碼:

df = pd.json_normalize(data)

我得到以下信息:

在此處輸入圖像描述

如您所見,第二個條目中有一個嵌套列表。 我想要兩列“player_out”和“kind”來代替“wickets”列。 我首選的 output 看起來像這樣:

在此處輸入圖像描述

利用:

df = df.drop(columns=['wickets']).join(df['wickets'].explode().apply(pd.Series))

你可以試試:

import pandas as pd
from collections import MutableMapping

def flatten(d, parent_key='', sep='.'):
    items = []
    for k, v in d.items():
        new_key = parent_key + sep + k if parent_key else k
        if isinstance(v, MutableMapping):
            items.extend(flatten(v, new_key, sep=sep).items())
        elif isinstance(v, list):
            for idx, value in enumerate(v):
                items.extend(flatten(value, new_key, sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

data = [{'batter': 'LA Marsh',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0}},
 {'batter': 'LA Marsh',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0},
  'wickets': [{'player_out': 'LA Marsh', 'kind': 'bowled'}]},
 {'batter': 'EA Perry',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0}}]

output = []
for dict_data in data:
    output.append(flatten(dict_data))

df = pd.DataFrame(output)
print(df)

Output:

    batter       bowler non_striker  runs.batter  runs.extras  runs.total wickets.player_out wickets.kind
0  LA Marsh  MJG Nielsen      M Kapp            0            0           0                NaN          NaN
1  LA Marsh  MJG Nielsen      M Kapp            0            0           0           LA Marsh       bowled

2  EA Perry  MJG Nielsen      M Kapp            0            0           0                NaN          NaN

如果你想繼續使用 json 規范化你需要首先同質化數據

應用 json 規范化

nan_entries = [{'player_out': pd.NA, 'kind':  pd.NA}]

data = [{'batter': 'LA Marsh',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0}},
 {'batter': 'LA Marsh',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0},
  'wickets': [{'player_out': 'LA Marsh', 'kind': 'bowled'}]},
 {'batter': 'EA Perry',
  'bowler': 'MJG Nielsen',
  'non_striker': 'M Kapp',
  'runs': {'batter': 0, 'extras': 0, 'total': 0}}]

# homogenize data
nan_entries = [{'player_out': pd.NA, 'kind':  pd.NA}]
for entry in data:
    if 'wickets' not in entry.keys():
        entry['wickets'] = nan_entries
# use json normailze

pd.json_normalize(data, 
                  record_path='wickets', 
                  meta=['batter', 'bowler', 'non_striker', ['runs', 'batter'],
                         ['runs', 'extras'], ['runs', 'total'] ],
                  record_prefix='wickets.')

output

wickets.player_out  wickets.kind    batter  bowler  non_striker     runs.batter     runs.extras     runs.total
0        <NA>        <NA>         LA Marsh  MJG Nielsen     M Kapp  0   0   0
1      LA Marsh     bowled        LA Marsh  MJG Nielsen     M Kapp  0   0   0
2       <NA>         <NA>         EA Perry  MJG Nielsen     M Kapp  0   0   0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM