34

pandas データフレームの IPython html 表示をフォーマットするにはどうすればよいですか?

  1. 数字は右詰めです
  2. 数字にはカンマが千単位の区切り文字として含まれています
  3. 大きな浮動小数点数には小数点以下の桁数がありません

numpy私はそれが私ができる場所の施設を持っていることを理解してset_printoptionsいます:

int_frmt:lambda x : '{:,}'.format(x)
np.set_printoptions(formatter={'int_kind':int_frmt})

他のデータ型についても同様です。

ただし、データフレームを html で表示する場合、IPython はこれらの書式設定オプションを選択しません。私はまだ持っている必要があります

pd.set_option('display.notebook_repr_html', True)

ただし、上記のように 1、2、3 を使用します。

編集:以下は2と3の私の解決策です(これが最善の方法かどうかはわかりません)が、数値列を右揃えにする方法を理解する必要があります。

from IPython.display import HTML
int_frmt = lambda x: '{:,}'.format(x)
float_frmt = lambda x: '{:,.0f}'.format(x) if x > 1e3 else '{:,.2f}'.format(x)
frmt_map = {np.dtype('int64'):int_frmt, np.dtype('float64'):float_frmt}
frmt = {col:frmt_map[df.dtypes[col]] for col in df.columns if df.dtypes[col] in frmt_map.keys()}
HTML(df.to_html(formatters=frmt))
4

3 に答える 3

25

HTML は、html データのカスタム文字列を受け取ります。.dataframeクラスのカスタム CSS スタイル (to_htmlメソッドがテーブルに追加する) を含むスタイル タグを渡すことを誰も禁止していません。

したがって、最も簡単な解決策は、スタイルを追加して、それを次の出力と連結することdf.to_htmlです。

style = '<style>.dataframe td { text-align: right; }</style>'
HTML( style + df.to_html( formatters=frmt ) )

ただし、ノートブック内のすべてのテーブルのスタイルが変更されるため、DataFrame のカスタム クラスを定義することをお勧めします (スタイルは「グローバル」です)。

style = '<style>.right_aligned_df td { text-align: right; }</style>'
HTML(style + df.to_html(formatters=frmt, classes='right_aligned_df'))

前のセルのいずれかでスタイルを定義してから、メソッドのclassesパラメーターを設定することもできます。to_html

# Some cell at the begining of the notebook
In [2]: HTML('''<style>
                    .right_aligned_df td { text-align: right; }
                    .left_aligned_df td { text-align: right; }
                    .pink_df { background-color: pink; }
                </style>''')

...

# Much later in your notebook
In [66]: HTML(df.to_html(classes='pink_df'))
于 2013-09-18T17:08:39.047 に答える
3

OPのポイント2:

数字にはカンマが千単位の区切り文字として含まれています

pandas (0.20.1 以降) では、デフォルトの整数形式を簡単にオーバーライドすることはできません。pandas.io.formats.format.IntArrayFormatterlabmda関数)でハードコードされています:

class IntArrayFormatter(GenericArrayFormatter):

    def _format_strings(self):
        formatter = self.formatter or (lambda x: '% d' % x)
        fmt_values = [formatter(x) for x in self.values]
        return fmt_values

あなたが実際に求めているのは、すべての整数の形式をIntArrayFormatterオーバーライドする方法であると想定しています。次のように、カンマで区切られた数千の整数値を出力するために(「モンキーパッチ」)を置き換えます。

import pandas

class _IntArrayFormatter(pandas.io.formats.format.GenericArrayFormatter):

    def _format_strings(self):
        formatter = self.formatter or (lambda x: ' {:,}'.format(x))
        fmt_values = [formatter(x) for x in self.values]
        return fmt_values

pandas.io.formats.format.IntArrayFormatter = _IntArrayFormatter

ノート:

  • 0.20.0 より前は、フォーマッタはpandas.formats.format.
  • 0.18.1 より前は、フォーマッタはpandas.core.format.

さておき

フロートの場合、構成オプションがあるため、これらのフープをジャンプする必要はありません。

display.float_format: callable は浮動小数点数を受け入れ、希望する数値形式の文字列を返す必要があります。などの場所で使用されSeriesFormatterます。例については、を参照core.format.EngFormatterしてください。

于 2015-09-28T11:23:02.433 に答える