使用非唯一索引将DataFrame保存为Json

时间:2019-02-27 15:55:31

标签: python pandas

我的DF是:

df = pd.DataFrame({'city': ['POA', 'POA', 'SAN'], 'info' : [10,12,5]}, index = [4314902, 4314902, 4300803])
df.index.rename('ID_city', inplace=True)

output:

    city    info
ID_city     
4314902 POA 10
4314902 POA 12
4300803 SAN 5

我需要另存为按索引定向的json。仅当每个索引都是唯一的时,以下命令才有效。

df.to_json('df.json', orient='index')

是否可以保存此DataFrame,并在他找到重复索引时创建一个数组? 我的愿望输出:

{ 4314902 : [ {'city': 'POA', 'info': 10} , {'city': 'POA', 'info': 11} ]
 ,4300803 : {'city': 'SAN', 'info': 5} }

1 个答案:

答案 0 :(得分:1)

我不知道内置的Pandas功能,该功能可以处理json orient ='index'导出中的重复索引。

您当然可以手动构建它。将列合并为一个包含字典的列:

cols_as_dict = df.apply(dict, axis=1)
ID_city
4314902    {'city': 'POA', 'info': 10}
4314902    {'city': 'POA', 'info': 12}
4300803     {'city': 'SAN', 'info': 5}

将行放入列表中,并按索引分组:

combined = cols_as_dict.groupby(cols_as_dict.index).apply(list)
ID_city
4300803                         [{'city': 'SAN', 'info': 5}]
4314902    [{'city': 'POA', 'info': 10}, {'city': 'POA', ...

然后编写json:

combined.to_json() 
 '{"4300803":[{"city":"SAN","info":5}],"4314902":[{"city":"POA","info":10},{"city":"POA","info":12}]}'

即使每个索引只有一个条目,它也会创建一个列表。与混合数据类型(元素列表或单个元素)相比,这实际上应该使处理更加容易。

如果您设置为混合类型(字典或多个字典列表),请执行combined.to_dict(),将具有单个元素的列表更改回其第一个元素,然后转储json。