从 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 数据框?