我有一个pandas数据框,如:
In [61]: df = DataFrame(np.random.rand(3,4), index=['art','mcf','mesa'],
columns=['pol1','pol2','pol3','pol4'])
In [62]: df
Out[62]:
pol1 pol2 pol3 pol4
art 0.661592 0.479202 0.700451 0.345085
mcf 0.235517 0.665981 0.778774 0.610344
mesa 0.838396 0.035648 0.424047 0.866920
我希望生成一行,其中包含基准测试中策略的平均值,然后绘制它。
目前,我这样做的方式是:
df = df.T
df['average'] = df.apply(average, axis=1)
df = df.T
df.plot(kind='bar')
是否有一种优雅的方法可以避免双重换位?
我试过了:
df.append(DataFrame(df.apply(average)).T)
df.plot(kind='bar')
这将附加正确的值,但不会正确更新索引并且图形混乱。
澄清。具有双转置的代码的结果是: 这就是我要的。显示基准和政策的平均值,而不仅仅是平均值。如果我能做得更好,我只是好奇。
请注意,图例通常会搞砸。要修复:
ax = df.plot(kind='bar')
ax.legend(patches, list(df.columns), loc='best')
答案 0 :(得分:8)
您可以简单地使用mean
的实例方法DataFrame
,然后绘制结果。没有必要换位。
In [14]: df.mean()
Out[14]:
pol1 0.578502
pol2 0.393610
pol3 0.634424
pol4 0.607450
In [15]: df.mean().plot(kind='bar')
Out[15]: <matplotlib.axes.AxesSubplot at 0x4a327d0>
如果你想绘制所有列的条形和均值,你可以append
平均值:
In [95]: average = df.mean()
In [96]: average.name = 'average'
In [97]: df = df.append(average)
In [98]: df
Out[98]:
pol1 pol2 pol3 pol4
art 0.661592 0.479202 0.700451 0.345085
mcf 0.235517 0.665981 0.778774 0.610344
mesa 0.838396 0.035648 0.424047 0.866920
average 0.578502 0.393610 0.634424 0.607450
In [99]: df.plot(kind='bar')
Out[99]: <matplotlib.axes.AxesSubplot at 0x52f4390>
如果您的布局不适合子图tight_layout
,则会调整matplotlib参数。