![](/img/trans.png)
[英]Pandas: Convert a JSON column with multiple rows into multiple dataframe rows
[英]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.