簡體   English   中英

將 pandas json 列轉換為多行

[英]convert pandas json column to multiple rows

data1 = {0: [{'confident': False, 'iab': 'IAB25-3'}],
 1: [{'confident': False, 'iab': 'IAB6-6'},
  {'confident': True, 'iab': 'IAB6'}],
 2: [{'confident': True, 'iab': 'IAB16-1'},
  {'confident': True, 'iab': 'IAB16'},
  {'confident': False, 'iab': 'IAB9'},
  {'confident': False, 'iab': 'IAB9-28'}]}

上面的格式最初是每行中的列表/json = [{'confident': False, 'iab': 'IAB25-3'},{'confident': True, 'iab': 'IAB16'}] 這是在 to_dict() 的幫助下轉換為字典導致了開頭提到的數據。 主要問題是集合數組(自信和 iab)可以是 n 次並且 n 是未知的。 所以,我無法格式化它。

在給定 dataframe 格式的情況下,我正在努力將其轉換為以下格式,但尚未成功。

rowid   confident    iab
0       False        IAB25-3
1       False        IAB6-6
1       True         IAB6
2       True         IAB16-1
2       True         IAB16
2       False        IAB9
2       False        IAB9-28

任何幫助表示贊賞。

想法是使用列表理解來平展值,並將鍵值預先添加到字典列表的新rowid鍵中,因此如果性能很重要,可以傳遞給DataFrame構造函數:

df = pd.DataFrame([dict(**{'rowid':k}, **y) for k, v in data1.items() for y in v])

print (df)
   rowid  confident      iab
0      0      False  IAB25-3
1      1      False   IAB6-6
2      1       True     IAB6
3      2       True  IAB16-1
4      2       True    IAB16
5      2      False     IAB9
6      2      False  IAB9-28

另一個具有concat和 dict 理解的解決方案應該更好的是字典中很少有大 DataFrame,但通常concat生成許多小的DataFrame很慢:

df = (pd.concat({k: pd.DataFrame(v) for k, v in data1.items()})
        .reset_index(level=1, drop=True)
        .rename_axis('rowid')
        .reset_index())
print (df)
   rowid  confident      iab
0      0      False  IAB25-3
1      1      False   IAB6-6
2      1       True     IAB6
3      2       True  IAB16-1
4      2       True    IAB16
5      2      False     IAB9
6      2      False  IAB9-28

這是使用json_normalize的另一種方式:

dfs = []
for k, v in data1.items():
    df = pd.json_normalize(v)
    df['rowid'] = k
    dfs.append(df)

df = pd.concat(dfs).reset_index(drop='index')
print(df)


   confident      iab  rowid
0      False  IAB25-3      0
1      False   IAB6-6      1
2       True     IAB6      1
3       True  IAB16-1      2
4       True    IAB16      2
5      False     IAB9      2
6      False  IAB9-28      2

暫無
暫無

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

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