简短版本:
我试图从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数组,每个对象都有year
和amount
个键。
我部分完成此操作的唯一方法是添加索引列并使用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字符串中的每个对象前添加了无关索引(整个包装在另一个对象中)。
任何有关如何实现这一目标的提示都将受到高度赞赏!
答案 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}]'