Pandas GroupBy 对象不是 Plot.ly 的“可序列化”对象

Posted

技术标签:

【中文标题】Pandas GroupBy 对象不是 Plot.ly 的“可序列化”对象【英文标题】:Pandas GroupBy object is not 'serializable' by Plot.ly 【发布时间】:2014-07-15 19:14:08 【问题描述】:

我正在尝试使用 Plotly 创建箱线图,但在尝试使用已分组的 Pandas DataFrame 时出现错误。一些初步的挖掘产生了这段代码来将 Pandas 转换为 Plotly 接口:

def df_to_iplot(df):

'''
Coverting a Pandas Data Frame to Plotly interface
'''
x = df.index.values
lines=
for key in df:
    lines[key]=
    lines[key]["x"]=x
    lines[key]["y"]=df[key].values
    lines[key]["name"]=key

    #Appending all lines
lines_plotly=[lines[key] for key in df]
return lines_plotly

这种将 DataFrame 转换为 Plotly 兼容系列的方法是否有替代方法?上面的代码是用于折线图的,但我想迭代我的维度来为我的 DataFrame 中的每个组生成一个箱线图。这是我收到的错误消息:

“TypeError:pandas.core.groupby.SeriesGroupBy 对象不是 JSON 可序列化的”

这是来自 Plotly 网站的示例:https://plot.ly/python/box-plots

import plotly.plotly as py
from plotly.graph_objs import *

py.sign_in("xxxx", "xxxxxxxxxx")

import numpy as np
y0 = np.random.randn(50)
y1 = np.random.randn(50)+1

trace0 = Box(
    y=y0
)
trace1 = Box(
    y=y1
)
data = Data([trace0, trace1])

unique_url = py.plot(data, filename = 'basic-box-plot')

【问题讨论】:

当你对一个DataFrame进行分组时,结果不是一个DataFrame。正如您的错误消息所示,它是一个 GroupBy 对象。您能否举例说明数据格式以及您要绘制的内容? 对,这是有道理的。我的数据是按县分组的学校表现分数(每个县都有几所学校具有相应的成绩)。我想为每个县绘制一个箱线图(代表该县分数的最小值/中值/最大值等)。 我对情节一无所知。你能描述一下你需要的结果格式吗?它必须是字典还是什么? 请编辑您的帖子,而不是将代码放入 cmets。您能否提供指向您所指示例的链接?我通过谷歌搜索找到的唯一情节箱线图示例没有提及系列。 【参考方案1】:

如果我理解正确,你想要这样的东西:

data = Data([Box(y=v.values) for k, v in g])

(其中g 是您的分组对象)。然后你可以在上面使用py.plot

就像我在 cmets 中所说的,我对情节一无所知;我只是根据你的例子。我们会看看是否有人知道更多关于 plotly 的回复。如果做不到这一点,如果你能在你的问题中解释你想要数据的格式(即,找出情节想要的格式),那将会很有帮助。

【讨论】:

非常感谢您花时间回复。如果我正确地遵循您的代码,k 和 v 迭代器代表我的分组数据帧的维度?所以本质上“对于县,DataFrame 中的学校”是怎么读的? @Wipa:我相信是这样,但如果没有看到您的数据,我无法确定。我建议您查看the groupby documentation 以了解如何使用 GroupBy 对象。这将帮助您了解我的示例中发生了什么,以及将来如何使用 GroupBy 对象。

以上是关于Pandas GroupBy 对象不是 Plot.ly 的“可序列化”对象的主要内容,如果未能解决你的问题,请参考以下文章

pandas之折线图(plot)

熊猫 .plot.hist() 和 .groupby()

绘制 Pandas DataSeries.GroupBy

绘制 Pandas DataSeries.GroupBy

使用 Pandas 在同一图中绘制分组数据

如何让 pandas groupby 不偷懒?