从 Pandas Groupby 数据框创建等高线图

Posted

技术标签:

【中文标题】从 Pandas Groupby 数据框创建等高线图【英文标题】:Create Contour Plot from Pandas Groupby Dataframe 【发布时间】:2014-07-24 19:10:46 【问题描述】:

我有以下 Pandas 数据框:

In [66]: hdf.size()
Out[66]:
a           b
0           0.0          21004
            0.1         119903
            0.2         186579
            0.3         417349
            0.4         202723
            0.5         100906
            0.6          56386
            0.7           6080
            0.8           3596
            0.9           2391
            1.0           1963
            1.1           1730
            1.2           1663
            1.3           1614
            1.4           1309
...
186         0.2         15
            0.3          9
            0.4         21
            0.5          4
187         0.2          3
            0.3         10
            0.4         22
            0.5         10
188         0.0         11
            0.1         19
            0.2         20
            0.3         13
            0.4          7
            0.5          5
            0.6          1
Length: 4572, dtype: int64

你看,a 从 0...188 和 b 在每个组中从某个值到某个值。并作为指定的Z值,对a/b的出现次数。

如何从分组数据框中获取计数或热图?

我有这个(要求?):

numcols, numrows = 30, 30
xi = np.linspace(0, 200, numcols)
yi = np.linspace(0, 6, numrows)
xi, yi = np.meshgrid(xi, yi)
zi = griddata(?, ?, hdf.size().values, xi, yi)

如何从 Groupby 对象中获取 x 和 y 值并绘制轮廓?

【问题讨论】:

【参考方案1】:

非常感谢!我的错是,我没有意识到,我必须对 groupby 数据框应用一些函数,比如.size(),才能使用它......

hdf = aggdf.groupby(['a','b']).size()
hdf

给我

a           b
1           -2.0          1
            -1.9          1
            -1.8          1
            -1.7          2
            -1.6          5
            -1.5         10
            -1.4          9
            -1.3         21
            -1.2         34
            -1.1         67
            -1.0         65
            -0.9         94
            -0.8        180
            -0.7        242
            -0.6        239
...
187          0.4        22
             0.5        10
188         -0.6         2
            -0.5         2
            -0.4         1
            -0.3         2
            -0.2         5
            -0.1        10
            -0.0        18
             0.1        19
             0.2        20
             0.3        13
             0.4         7
             0.5         5
             0.6         1
Length: 8844, dtype: int64

有了这个,还有你的帮助 CT 朱,我就可以做到了

hdfreset = hdf.reset_index()
hdfreset.columns = ['a', 'b', 'occurrence']
hdfpivot=hdfreset.pivot('a', 'b')

这终于给了我正确的价值观

X=hdfpivot.columns.levels[1].values
Y=hdfpivot.index.values
Z=hdfpivot.values
Xi,Yi = np.meshgrid(X, Y)
plt.contourf(Yi, Xi, Z, alpha=0.7, cmap=plt.cm.jet);

这导致了这个美丽的轮廓:

【讨论】:

很好的解决方案,您可以接受自己的答案,仅供参考。 如何将此示例扩展到超过 2 维的网格?【参考方案2】:

欢迎来到 SO。

看起来很明显,对于您的每个“a”级别,“b”级别的数量都不相同,因此我将建议以下解决方案:

In [44]:

print df #an example, you can get your dataframe in to this by rest_index()
    a  b     value
0   0  1  0.336885
1   0  2  0.276750
2   0  3  0.796488
3   1  1  0.156050
4   1  2  0.401942
5   1  3  0.252651
6   2  1  0.861911
7   2  2  0.914803
8   2  3  0.869331
9   3  1  0.284757
10  3  2  0.488330

[11 rows x 3 columns]
In [45]:
#notice that you will have some 'NAN' values
df=df.pivot('a', 'b', 'value')
In [46]:

X=df.columns.values
Y=df.index.values
Z=df.values
x,y=np.meshgrid(X, Y)
plt.contourf(x, y, Z) #the NAN will be plotted as white spaces
Out[46]:
<matplotlib.contour.QuadContourSet instance at 0x1081385a8>

【讨论】:

非常感谢!可以用零 (Z) 填充 b 的不可用值。我忘记了,但我认为它更容易,不是吗? 当然你可以在pandas中使用fillna()来做到这一点。但我认为这取决于 0 是否是您数据的可能值(实际上意味着什么) 我没有让 Groupby 对象为我工作。 Cannot access callable attribute 'reset_index' of 'DataFrameGroupBy' objects, try using the 'apply' method

以上是关于从 Pandas Groupby 数据框创建等高线图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pandas groupby().sum() 的输出创建一个新列?

带有 MultiIndexing 的 Pandas 数据框中的 Groupby

如何通过分组索引访问 pandas groupby 数据框?

Pandas Groupby结果到一个单独的数据框中

将 groupby 平均统计数据映射为 pandas 中的新列

如何在 Pandas 中的超大数据框上创建数据透视表