1. ホーム
  2. python

[解決済み] pandasのDataFrameテーブルをpngで保存する方法

2023-03-21 04:48:37

質問

pandasのデータフレームで結果を構築しました。このデータフレームはテーブルとして機能します。MultiIndexedのカラムがあり、各行は名前を表しています、つまり index=['name1','name2',...] というように、DataFrameを作成するときに名前を指定します。このテーブルを表示し、png(または任意のグラフィックフォーマット)として保存したいと思います。今のところ、htmlに変換するのが一番近いのですが、pngが欲しいのです。似たような質問があるようで、例えば Pandasのdataframe/seriesデータを図として保存する方法は?

しかし、マークされたソリューションは、データフレームを(テーブルではなく)ラインプロットに変換し、他のソリューションはPySideに依存していますが、私はLinux上でそれをpipインストールできないので、単に離れていたいと思っています。私は、このコードが簡単に移植できることを望みます。私は本当にpythonで簡単にpngにテーブルを作成することを期待していた。すべての助けは感謝されます。

どのように解決するのですか?

Pandasでは、matplotlibを使って表を描画することができます(詳細 ここで ). 通常、これはテーブルを直接プロットします(軸やすべてを含む)が、これはあなたが望むものではありません。 しかし、これらは最初に削除することができます。

import matplotlib.pyplot as plt
import pandas as pd
from pandas.table.plotting import table # EDIT: see deprecation warnings below

ax = plt.subplot(111, frame_on=False) # no visible frame
ax.xaxis.set_visible(False)  # hide the x axis
ax.yaxis.set_visible(False)  # hide the y axis

table(ax, df)  # where df is your data frame

plt.savefig('mytable.png')

出力は最も美しいものではないかもしれませんが、table()関数に対する追加の引数を見つけることができます。 ここで . また この記事 にも感謝します。


EDITです。

上記の方法でプロットする際に、マルチインデックスをシミュレートする(確かにかなりハチャメチャな)方法を紹介します。 dfというマルチインデックスデータフレームがある場合、それは以下のようになります。

first  second
bar    one       1.991802
       two       0.403415
baz    one      -1.024986
       two      -0.522366
foo    one       0.350297
       two      -0.444106
qux    one      -0.472536
       two       0.999393
dtype: float64

まず、インデックスをリセットして、通常のカラムになるようにします。

df = df.reset_index() 
df
    first second       0
0   bar    one  1.991802
1   bar    two  0.403415
2   baz    one -1.024986
3   baz    two -0.522366
4   foo    one  0.350297
5   foo    two -0.444106
6   qux    one -0.472536
7   qux    two  0.999393

高次の複数インデックス列を空文字列に設定して、すべての重複を削除します(私の例では、"first" にのみインデックスが重複しています)。

df.ix[df.duplicated('first') , 'first'] = '' # see deprecation warnings below
df
  first second         0
0   bar    one  1.991802
1          two  0.403415
2   baz    one -1.024986
3          two -0.522366
4   foo    one  0.350297
5          two -0.444106
6   qux    one -0.472536
7          two  0.999393

indexes"上の列名を空文字列に変更します。

new_cols = df.columns.values
new_cols[:2] = '',''  # since my index columns are the two left-most on the table
df.columns = new_cols 

ここで、テーブル関数を呼び出しますが、テーブルのすべての行のラベルを空の文字列に設定します(これは、プロットの実際のインデックスが表示されないことを確認します)。

table(ax, df, rowLabels=['']*df.shape[0], loc='center')

et voila:

あまりきれいではありませんが、完全に機能的なマルチインデックス・テーブルです。

edit: 非推奨の警告

コメントで指摘されているように、インポートステートメントで table :

from pandas.tools.plotting import table

は pandas の新しいバージョンでは非推奨となり、代わりに

from pandas.plotting import table 

編集: 非推奨の警告 2

この ix インデクサは、現在では完全に 非推奨 を使用する必要があります。 loc インデクサを使うべきです。置き換えてください。

df.ix[df.duplicated('first') , 'first'] = ''

df.loc[df.duplicated('first') , 'first'] = ''