[英]Flatten nested JSON (has multiple list) into multiple pandas dataframe columns
我有一個 pandas 列,其中包含嵌套的 json 數據字符串。 我想將數據展平為多個 pandas 列。 我有這樣的數據:
{
'A': '123',
'B': '2019-08-26',
'C': [
{
'a': 'stop',
'b': 'A+'
},
{
'a': 'go',
'b': 'C+'
}
],
'D': [],
'E': [
{
'a': 'Don',
'b': 1
},
{
'b': 12
}
],
}
對於 pandas 列中的每個單元格,我想解析這個字符串並創建多個列。 預期的 output 看起來像這樣:
| A | B | C.a | C.b | D.a | D.b | E.a | E.b |
|---- |------|-----|-----|-----|-----|-----|-----|
| 123 | 2019-08-26 | stop | A+ | Nan | Nan | Don | 1 |
| 123 | 2019-08-26 | go | C+ | Nan | Nan | Don | 1 |
| 123 | 2019-08-26 | stop | A+ | Nan | Nan | NaN | 12 |
| 123 | 2019-08-26 | go | C+ | Nan | Nan | Nan | 12 |
我嘗試使用 json_normalize,但它返回錯誤....請幫助我:(
將pd.json_normalize
與df.explode
和pd.concat
一起使用:
In [308]: x = pd.json_normalize(j).explode('C').explode('E')
In [310]: r = pd.concat([x.drop(['C', 'E'], 1).reset_index(drop=True), pd.json_normalize(x.C), pd.json_normalize(x.E)], 1)
In [316]: C_cols = [f'C.{i}' for i in pd.json_normalize(x.C).columns]
In [317]: E_cols = [f'E.{i}' for i in pd.json_normalize(x.E).columns]
In [323]: r.columns = [*x.drop(['C', 'E'], 1).columns , *C_cols, *E_cols]
In [324]: r
Out[324]:
A B D C.a C.b E.a E.b
0 123 2019-08-26 [] stop A+ Don 1
1 123 2019-08-26 [] stop A+ NaN 12
2 123 2019-08-26 [] go C+ Don 1
3 123 2019-08-26 [] go C+ NaN 12
與@Mayank Porwal 的回答類似,首先使用pd.json_normalize
+ df.explode
。 然后使用str.get
方法從['C','D','E']
列中的字典中收集值:
df = pd.json_normalize(json_data).explode('C').explode('E')
for col in ['C','D','E']:
for i in ['a','b']:
df[col+'.'+i] = df[col].str.get(i)
df['E.a'].replace({None:np.nan}, inplace=True)
df = df.drop(['C','E','D'], axis=1).sort_values(by='E.b')
Output:
A B C.a C.b D.a D.b E.a E.b
0 123 2019-08-26 stop A+ NaN NaN Don 1
0 123 2019-08-26 go C+ NaN NaN Don 1
0 123 2019-08-26 stop A+ NaN NaN NaN 12
0 123 2019-08-26 go C+ NaN NaN NaN 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.