English 中文(简体)
Pretty-print an entire Pandas Series / DataFrame
原标题:

I work with Series and DataFrames on the terminal a lot. The default __repr__ for a Series returns a reduced sample, with some head and tail values, but the rest missing.

Is there a builtin way to pretty-print the entire Series / DataFrame? Ideally, it would support proper alignment, perhaps borders between columns, and maybe even color-coding for the different columns.

最佳回答

You can also use the option_context, with one or more options:

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

This will automatically return the options to their previous values.

If you are working on jupyter-notebook, using display(df) instead of print(df) will use jupyter rich display logic (like so).

问题回答

No need to hack settings. There is a simple way:

print(df.to_string())

Sure, if this comes up a lot, make a function like this one. You can even configure it to load every time you start 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 )

As for coloring, getting too elaborate with colors sounds counterproductive to me, but I agree something like bootstrap s .table-striped would be nice. You could always create an issue to suggest this feature.

After importing pandas, as an alternative to using the context manager, set such options for displaying entire dataframes:

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

For full list of useful options, see:

pd.describe_option( display )

Use the tabulate package:

pip install tabulate

And consider the following example usage:

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 |
+----+--------------+---------+-------+

Using pd.options.display

This answer is a variation of the prior answer by lucidyan. It makes the code more readable by avoiding the use of set_option.

After importing pandas, as an alternative to using the context manager, set such options for displaying large dataframes:

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

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

set_pandas_display_options()

After this, you can use either display(df) or just df if using a notebook, otherwise print(df).

Regarding any columns containing floating point numbers while having the object dtype, such columns need to first be converted to the float dtype before the display precision will apply to them.

Using to_string

Pandas 0.25.3 does have DataFrame.to_string and Series.to_string methods which accept formatting options.

Using to_markdown

If what you need is markdown output, Pandas 1.0.0 has DataFrame.to_markdown and Series.to_markdown methods.

Using to_html

If what you need is HTML output, Pandas 0.25.3 does have a DataFrame.to_html method but not a Series.to_html. Note that a Series can be converted to a DataFrame.

If you are using Ipython Notebook (Jupyter). You can use HTML

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

Try this

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)

Scripts

Nobody has proposed this simple plain-text solution:

from pprint import pprint

pprint(s.to_dict())

which produces results like the following:

{ % Diabetes : 0.06365372374283895,
  % Obesity : 0.06365372374283895,
  % Bachelors : 0.0,
  % Poverty : 0.09548058561425843,
  % Driving Deaths : 1.1775938892425206,
  % Excessive Drinking : 0.06365372374283895}

Jupyter Notebooks

Additionally, when using Jupyter notebooks, this is a great solution.

Note: pd.Series() has no .to_html() so it must be converted to pd.DataFrame()

from IPython.display import display, HTML

display(HTML(s.to_frame().to_html()))

which produces results like the following:

Display pd.Series as table in Jupyter notebooks

just run this

    pd.set_option("display.max_rows", None, "display.max_columns", None)
    print(df)

just do this

Output

Column
0    row 0
1    row 1
2    row 2
3    row 3
4    row 4
5    row 5
6    row 6
7    row 7
8    row 8
9    row 9
10  row 10
11  row 11
12  row 12
13  row 13
14  row 14
15  row 15
16  row 16
17  row 17
18  row 18
19  row 19
20  row 20
21  row 21
22  row 22
23  row 23
24  row 24
25  row 25
26  row 26
27  row 27
28  row 28
29  row 29
30  row 30
31  row 31
32  row 32
33  row 33
34  row 34
35  row 35
36  row 36
37  row 37
38  row 38
39  row 39
40  row 40
41  row 41
42  row 42
43  row 43
44  row 44
45  row 45
46  row 46
47  row 47
48  row 48
49  row 49
50  row 50
51  row 51
52  row 52
53  row 53
54  row 54
55  row 55
56  row 56
57  row 57
58  row 58
59  row 59
60  row 60
61  row 61
62  row 62
63  row 63
64  row 64
65  row 65
66  row 66
67  row 67
68  row 68
69  row 69

datascroller was created in part to solve this problem.

pip install datascroller

It loads the dataframe into a terminal view you can "scroll" with your mouse or arrow keys, kind of like an Excel workbook at the terminal that supports querying, highlighting, etc.

import pandas as pd
from datascroller import scroll

# Call `scroll` with a Pandas DataFrame as the sole argument:
my_df = pd.read_csv( <path to your csv> )
scroll(my_df)

Disclosure: I am one of the authors of datascroller

You can set expand_frame_repr to False:

display.expand_frame_repr : boolean

Whether to print out the full DataFrame repr for wide DataFrames across multiple lines, max_columns is still respected, but the output will wrap-around across multiple “pages” if its width exceeds display.width.

[default: True]


pd.set_option( expand_frame_repr , False)

For more details read How to Pretty-Print Pandas DataFrames and Series

You can achieve this using below method. just pass the total no. of columns present in the DataFrame as arg to

display.max_columns

For eg :

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




相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签