簡體   English   中英

將嵌套的 JSON 轉換為 Pandas df

[英]Transforming nested JSON to Pandas df

我有一個看起來像這樣的 JSON:

{
  "4.0": {
    "A1": {
      "dR-14": 1.181,
      "ev": 1.102,
      "move11": 1.259,
      "move6": 1.259,
      "sILo": 1.259,
      "tR-14": 1.04
    },
    "A2": {
      "dR-03": 0.418,
      "ev": -0.177,
      "move11": 1.663,
      "move6": 1.663,
      "sILo": 0.418,
      "tR-03": 0.818
    },
    "A3": {
      "dR-16": 3.956,
      "ev": 3.667,
      "move11": 4.179,
      "sILo": 4.246,
      "tR-16": 3.465
    },
...

我正在嘗試將它放入看起來像這樣的 pandas df

var1 var2 dR     ev     move11 move6 sILo   tR
4.0  A1   1.181  1.102  1.259  1.259 1.259  1.04
4.0  A2   0.418  -0.177 1.663  1.663 0.418  0.818
4.0  A3   3.956  3.667  4.179  NaN   4.246  3.465

我試過使用 pandas json_normalize 像這樣:

js = pd.read_json('path', orient='index', typ='series', convert_dates=False, convert_axes = True)
pd.json_normalize(js, record_prefix = True)

但這連接了第一個和第二個索引,所以我最終得到一個看起來像這樣的 df:

    A1.0.2          A2.0.8 ... 
0   1.0             1.0
1   NaN             NaN

我已經為 read_json 和 json_normalize 嘗試了一些不同的 arg 組合,所有結果都相似。

利用:

# STEP 1
df = pd.DataFrame(data).stack()

# STEP 2
df = df.apply(pd.Series).rename_axis(['var1', 'var2']).reset_index()

# STEP 3
df['dR'] = df.filter(like='dR').stack().reset_index(drop=True)
df['tR'] = df.filter(like='tR').stack().reset_index(drop=True)

# STEP 4
m = df.columns.str.contains(r'^dR-\d+') | df.columns.str.contains(r'^tR-\d+')
df = df.loc[:, ~m]

腳步:

# STEP 1
A1  4.0    {'dR-14': 1.181, 'ev': 1.102, 'move11': 1.259,...
A2  4.0    {'dR-03': 0.418, 'ev': -0.177, 'move11': 1.663...
A3  4.0    {'dR-16': 3.956, 'ev': 3.667, 'move11': 4.179,...


# STEP 2
  var1 var2  dR-14     ev  move11  move6   sILo  tR-14  dR-03  tR-03  dR-16  tR-16
0  4.0   A1  1.181  1.102   1.259  1.259  1.259   1.04    NaN    NaN    NaN    NaN
1  4.0   A2    NaN -0.177   1.663  1.663  0.418    NaN  0.418  0.818    NaN    NaN
2  4.0   A3    NaN  3.667   4.179    NaN  4.246    NaN    NaN    NaN  3.956  3.465

# STEP 3
  var1 var2  dR-14     ev  move11  move6   sILo  tR-14  dR-03  tR-03  dR-16  tR-16     dR     tR
0  4.0   A1  1.181  1.102   1.259  1.259  1.259   1.04    NaN    NaN    NaN    NaN  1.181  1.040
1  4.0   A2    NaN -0.177   1.663  1.663  0.418    NaN  0.418  0.818    NaN    NaN  0.418  0.818
2  4.0   A3    NaN  3.667   4.179    NaN  4.246    NaN    NaN    NaN  3.956  3.465  3.956  3.465

# STEP 4 (RESULT)
  var1 var2     ev  move11  move6   sILo     dR     tR
0  4.0   A1  1.102   1.259  1.259  1.259  1.181  1.040
1  4.0   A2 -0.177   1.663  1.663  0.418  0.418  0.818
2  4.0   A3  3.667   4.179    NaN  4.246  3.956  3.465

暫無
暫無

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

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