从Pandas Groupby数据框创建轮廓图

12 投票
2 回答
24637 浏览
提问于 2025-04-18 08:32

我有一个这样的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)

如何从分组对象中提取x和y的值,并绘制等高线图呢?

2 个回答

11

欢迎来到Stack Overflow。

很明显,对于每一个'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>

在这里输入图片描述

22

非常感谢!我之前犯的错误是没有意识到,我需要对分组后的数据框应用一些函数,比如 .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 Zhu,我就可以做

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);

这导致了这个漂亮的等高线图:

在这里输入图片描述

撰写回答