Pandasシリーズ/ DataFrame全体をきれいに印刷する


654

端末でSeriesとDataFrameをよく使用します。__repr__Series のデフォルトは、いくつかの頭と尾の値を含む減少したサンプルを返しますが、残りは欠落しています。

Series / DataFrame全体をきれいに印刷する組み込みの方法はありますか?理想的には、列間の境界線や、異なる列の色分けなど、適切な配置をサポートします。


19
出力の減少はpd.set_option('display.max_rows', 1000)、たとえば、変更できるデフォルトのオプションによるものです。たとえば、カラーリングは別のものです。htmlrepr出力のカラーリングについて話していると思います。これはまったく組み込まれていないと思います。
EdChum 2013年

2
@EdChum:おかげで、私はこれについて知っていましdisplay.max_rowsた。問題は、ほとんどの場合、出力が切り捨てられることです。全出力を確認したいのは、たまにです。オプションを非常に高い値に設定し__repr__、デフォルトのを使用してから、値を元に戻すこともできますが、これは少し面倒に思え、その場合は独自のpretty-print関数を作成することもできます。
Dun Peal 2013年

1
@EdChum:色に関して-これはカラーターミナルなので、値を簡単に区別できるように、各行を異なる色で印刷すると便利です。Pandasは、カラーを含む高度なターミナル機能を使用するipythonでうまく機能するので、Pandas自体にカラー機能があるかどうか疑問に思いました。
Dun Peal 2013年

1
私はターミナルシェルとしてIPythonではなくIPython NotebookでPandasを使用しset_optionています。色付けをサポートするオプションは表示されません。おそらく、CSSまたは出力フォーマットを適用するプラグインとして実行できるものです。これがあなたがこれを達成できると私が思う唯一の方法です
EdChum

回答:


867

option_contextと、1つ以上のオプションを使用することもできます。

with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
    print(df)

これにより、オプションが以前の値に自動的に戻ります。

jupyter-notebookで作業している場合、display(df)代わりにprint(df)を使用すると、jupyterリッチ表示ロジックが使用されます(同様)


2
ありがとうございました!最大値を設定Noneするとオフになります。使い方with pd.option_context()は非常にはっきりと明示的に何が起こっているオプションのドキュメントを、そしてそれはそれが所望され得る出力フォーマットでのその他の変更を達成するための方法を明確にし、例えばを使用してprecisionmax_colwidthexpand_frame_reprcolheader_justifydate_yearfirstencodingより多くの、そして多くの多く:pandas.pydata.org/pandas -docs / stable / options.html
nealmcb 2017年

37
不思議に思う人のために:jupyterを使用する場合は、display(df)代わりに使用してくださいprint(df)
tsvikas

3
ここで3は何を表していますか?
モナジャラル

1
DataFrameが本当に大きい場合は、一時的に.csvとして書き込み、Jupyter Labの高速csvビューアを使用するのが理にかなっている可能性があります
Dan

display.max_columnsの「3」は「None」にして、option_context paramをデフォルト値に設定する必要があります。修繕。
Trutane 2018

607

設定をハックする必要はありません。簡単な方法があります:

print(df.to_string())

1
カラムはいくつありますか?私は1300列で確認しましたが、正常に動作します。文字列インポートからのitertoolsインポートの組み合わせascii_letters df = pd.DataFrame(data = [[0] * 1326]、index = [0]、columns = [(a + b) a、bの組み合わせ(ascii_letters、2)])
Andrey Shokhin

11
使用してwith pd.option_context()はるかに明確かつ明示的に何が起こっているオプションのドキュメントを、そしてそれが出力の他の変更、それは望ましいことがある書式設定など使用して実現する方法を明確にしprecisionmax_colwidthexpand_frame_reprcolheader_justifydate_yearfirstencoding、と多くのより多くの:pandas.pydata.org/を
pandas

2
列がたくさんあり、画面にそれらを表示するのに十分な幅がない場合、これは私の例では奇妙に見えるので、私は他の答えを好みます。列名とデータは別々の改行を行うため、どのデータがどの列名に属しているかを確認するのは容易ではありません。
Dremet 2017

9
依頼者は「きれいなプリント」ソリューションを要求しました。これではありません。これがJupyter Notebook内で使用された場合、組み込みのプリティディスプレイはまったく使用されません。pd.set_option('display.max_rows', None)印刷の直前に使用することをお勧めしますdf
LS

@LSは、python 3.x Jupyterノートブックでpd.set_option( 'display.max_rows'、None)とdf.to_string()の両方をテストし、印刷時に同じ出力を生成しました。上記の回答が以前のバージョンで機能しなかった場合、現在は機能します。
Hフロッジ2018

166

確かに、これがたくさん出てきたら、このような関数を作ってください。IPythonを起動するたびにロードするように構成することもできます:https : //ipython.org/ipython-doc/1/config/overview.html

def print_full(x):
    pd.set_option('display.max_rows', len(x))
    print(x)
    pd.reset_option('display.max_rows')

着色については、色を凝らしすぎると逆効果に聞こえますが、ブートストラップの.table-stripedようなものがいいと思います。この機能を提案する問題を常に作成できます。


5
リンクが切れています。おそらくそれはipython.org/ipython-doc/dev/config/intro.htmlである必要がありますか?
ostrokach 14

2
誰か、だれか、または作成者でさえ、リンクを確認して修正し、これらのコメントに古いフラグを付けることができればすばらしいと思います。
アーロンホール

これは悪いことです。印刷操作の前にオプションがデフォルトに設定されていると想定しているため、必ずしもそうであるとは限らず、予期しない動作が発生する可能性があるためです。withステートメントと組み合わせてオプションコンテキストを使用する方がより堅牢なオプションであり、以前に設定されたものに戻ります。
inVader

104

パンダをインポートした後、コンテキストマネージャーを使用する代わりに、データフレーム全体を表示するためのオプションを設定します

pd.set_option('display.max_columns', None)  # or 1000
pd.set_option('display.max_rows', None)  # or 1000
pd.set_option('display.max_colwidth', -1)  # or 199

便利なオプションの完全なリストについては、以下を参照してください。

pd.describe_option('display')

1
これを追加していただきありがとうございます。「なし」は、複数のデータフレームを表示する場合、各単一データフレームの実際の長さよりもはるかに優れています。
Dremet 2017

5
@Corrumpo 完全な表現が必要な場合、一部のオプションではの-1代わりにint値を使用する必要がありますNone
lucidyan

display.オプション名にプレフィックスを付ける必要はないようです。たとえば、set_option('max_columns')同じように機能します。
Acumenus 2018


45

tabulateパッケージを使用します。

pip install tabulate

そして、次の使用例を考えてみましょう:

import pandas as pd
from io import StringIO
from tabulate import tabulate

c = """Chromosome Start End
chr1 3 6
chr1 5 7
chr1 8 9"""

df = pd.read_table(StringIO(c), sep="\s+", header=0)

print(tabulate(df, headers='keys', tablefmt='psql'))

+----+--------------+---------+-------+
|    | Chromosome   |   Start |   End |
|----+--------------+---------+-------|
|  0 | chr1         |       3 |     6 |
|  1 | chr1         |       5 |     7 |
|  2 | chr1         |       8 |     9 |
+----+--------------+---------+-------+

tabulateは、pd.Seriesを印刷するときに問題になります。
eliu

2
@eliu情報をありがとう。あなたはいつも持っていますpd_series.to_frame()
Unfun Cat

20

Ipython Notebook(Jupyter)を使用している場合。あなたはHTMLを使うことができます

from IPython.core.display import HTML
display(HTML(df.to_html()))

1
他のソリューション、Tnxとの比較のために出力を表示してください。
vwvan

7
これで大きなデータフレームを表示しようとすることに注意してください。.ipyndbファイルの未加工コードを編集しない限り、メモリが不足してノートブックを再び開くことができない場合があります。実話;)
FLBKernel

これは私にとって最良の選択肢です。テーブルは色付きで完全に表示されます。良いですね!
Ololade

20

使用する pd.options.display

この回答は、lucidyanによる以前の回答のバリエーションです。の使用を回避することにより、コードを読みやすくしますset_option

パンダをインポートした後、コンテキストマネージャーを使用する代わりに、大きなデータフレームを表示するためのオプションを設定します

def set_pandas_display_options() -> None:
    # Ref: https://stackoverflow.com/a/52432757/
    display = pd.options.display

    display.max_columns = 1000
    display.max_rows = 1000
    display.max_colwidth = 199
    display.width = None
    # display.precision = 2  # set as needed

set_pandas_display_options()

この後、あなたはどちらかを使用することができますdisplay(df)か、単にdfそれ以外の場合は、ノートブックを使用している場合print(df)

使用する to_string

パンダ0.25.3は持っていないDataFrame.to_stringSeries.to_string書式設定オプションを受け入れる方法。

使用する to_markdown

マークダウン出力が必要な場合、Pandas 1.0.0にはメソッドDataFrame.to_markdownSeries.to_markdownメソッドがあります。

使用する to_html

HTML出力が必要な場合、Pandas 0.25.3にはDataFrame.to_htmlメソッドがありSeries.to_htmlますが、はありません。注ことをSeriesすることができ、変換しますDataFrame


はい、これはset_optionの代わりにJupyterで表示するためのよりエレガントな方法のように見えます。表示された出力を左揃えにする方法はありますか?表示されるデータフレームの右の行は、デフォルトで右揃えになります。
vinsinraw

11

これを試して

pd.set_option('display.height',1000)
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)

3

以下の方法でこれを実現できます。合計を渡すだけです。引数としてDataFrameに存在する列の数

「display.max_columns」

たとえば:

df= DataFrame(..)
with pd.option_context('display.max_rows', None, 'display.max_columns', df.shape[1]):
    print(df)

-1

display()関数を使用してみてください。これは自動的に水平スクロールバーと垂直スクロールバーを使用し、これにより、print()を使用する代わりにさまざまなデータセットを簡単に表示できます。

display(dataframe)

display()も適切な配置をサポートしています。

ただし、データセットをより美しくしたい場合は、確認できますpd.option_context()。データフレームを明確に表示するためのオプションがたくさんあります。

注-私はJupyter Notebooksを使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.