我有一個 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”列。我的首選輸出如下所示:

uj5u.com熱心網友回復:
利用:
df = df.drop(columns=['wickets']).join(df['wickets'].explode().apply(pd.Series))
uj5u.com熱心網友回復:
你可以試試:
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)
輸出:
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
uj5u.com熱心網友回復:
如果您想繼續使用 json normalize,您需要首先對資料進行均質化
應用 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.')
輸出
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/505021.html
