在保留列名的同时将Pandas系列转换为JSON

时间:2015-11-29 04:42:42

标签: python json pandas

简短版本:

我试图从Pandas Series转到带有对象表示的JSON数组,而不会丢失过程中的列名。

长篇故事:

我在groupby的一列上使用DataFrame(据我所知,这会产生一个Series - 但这可能是我第一个错误的转变)。

year_dist = df.groupby(df['year']).size()
year_dist.name = 'amount' # Name of the aggregate column

结果数据(Series?)如下所示:

year
1990  10
1992  20
1995  15
1996  8
Name: amount, dtype: int64

它简单而且非常简单,正是我想要的。现在我希望通过链接to_json()将其转换为JSON。这也没问题,默认行为将产生:

{"1990":10,"1992":20,"1995":15,"1996":8}

然而,我想在JSON转换期间保留本系列的列名(列和系列名称),有效地创建一个这样的字符串:

[{year: "1990", amount :10}, {year:"1992", amount:20}, {year: "1995", amount:15}, {year:"1996", amount:8}]

包含对象的JSON数组,每个对象都有yearamount个键。

我部分完成此操作的唯一方法是添加索引列并使用orient关键字重新格式化JSON输出:

year_dist = year_dist.reset_index().to_json(orient='index')

哪个收益率:

{"0":{"year":1990,"amount":10},"1":{"year":1992,"amount":20},"2":{"year":1995,"amount":15},"3":{"year":1996,"amount":8}}

几乎完美,但现在我在JSON字符串中的每个对象前添加了无关索引(整个包装在另一个对象中)。

任何有关如何实现这一目标的提示都将受到高度赞赏!

1 个答案:

答案 0 :(得分:3)

我认为您需要使用reset_index制作数据框,然后使用orient="records"

x = pandas.Series([1, 2, 3], index=["A", "B", "C"])
x.index.name = "stuff"
x.name = "cruddo"

>>> print(x)
stuff
A    1
B    2
C    3
Name: cruddo, dtype: int64
>>> x.reset_index().to_json(orient='records')
[{"stuff":"A","cruddo":1},{"stuff":"B","cruddo":2},{"stuff":"C","cruddo":3}]'