将 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'}]}
上面的格式原来是每行的list/json = [{'confident': False, 'iab': 'IAB25-3'},{'confident':是的, 'iab': 'IAB16'}] 在 to_dict() 的帮助下转换为字典导致了开头提到的数据。
主要问题是集合数组(confident 和 iab)可以是 n 次并且 n 是未知的。所以,我无法格式化它。
我非常努力地将它转换成下面给定的数据帧格式,但还没有成功。
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
和字典理解应该更好的解决方案是字典中很少有大数据帧,但通常 concat
生成许多小 DataFrame
s 很慢:
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
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'}]}
上面的格式原来是每行的list/json = [{'confident': False, 'iab': 'IAB25-3'},{'confident':是的, 'iab': 'IAB16'}] 在 to_dict() 的帮助下转换为字典导致了开头提到的数据。 主要问题是集合数组(confident 和 iab)可以是 n 次并且 n 是未知的。所以,我无法格式化它。
我非常努力地将它转换成下面给定的数据帧格式,但还没有成功。
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
和字典理解应该更好的解决方案是字典中很少有大数据帧,但通常 concat
生成许多小 DataFrame
s 很慢:
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