将 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 生成许多小 DataFrames 很慢:

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