348

I want to print the whole dataframe, but I don't want to print the index

Besides, one column is datetime type, I just want to print time, not date.

The dataframe looks like:

   User ID           Enter Time   Activity Number
0      123  2014-07-08 00:09:00              1411
1      123  2014-07-08 00:18:00               893
2      123  2014-07-08 00:49:00              1041

I want it print as

User ID   Enter Time   Activity Number
123         00:09:00              1411
123         00:18:00               893
123         00:49:00              1041
2
  • 1
    ... I will say that if this is actually Python and those are datetime.datetime objects in the second column, then you can print just the time using the strftime method, with an appropriate format string (probably "%H:%M:%S"). Commented Jul 9, 2014 at 3:02
  • 31
    @Zack: DataFrame is the name of the 2D data structure in pandas, a popular Python data analysis library. Commented Jul 9, 2014 at 3:09

12 Answers 12

445
print(df.to_string(index=False))
Sign up to request clarification or add additional context in comments.

5 Comments

This is nice, however it does not contain the tab-sep anymore which is than a handicap when copying to excel
@Rockbar if you want to copy/export to excel you should be using df.to_csv anyway.
For me the column labels come out not justified to the data (there are spaces missing at the start). Maybe because my data takes up more characters than the column label. Adding the argument justify='left' fixes it, though obviously changes the alignment of the column labels.
You can also use df.to_clipboard() and then paste into Excel. Useful for dealing with Windows's stupid "you can't edit an open document" BS.
df.to_excel('filename.xlsx', index=False)
106

The line below would hide the index column of DataFrame when you print

df.style.hide()

9 Comments

Requires jinja2 package and does not produce the desired output with Python 3.7
I find this answer is most effective to copy/paste into a table when making a report, thank you !
I like this answer best - produces correct output with Python 3.8 and works without having to print the dataframe (useful for Jupyter notebook/lab applications)
In Python 3.9.5, this has no effect: Running this and then printing df still shows row index numbers on the left. (When running in regular terminal/console from bash shell.)
Attention, this method is deprecated: FutureWarning: this method is deprecated in favour of Styler.hide(axis='index')
|
61

To retain "pretty-print" in Jupyter, use:

from IPython.display import HTML
HTML(df.to_html(index=False))

enter image description here

5 Comments

This is perfect thank you. Still a clean cut DataFrame displayed in the notebook, simply without the index column. Exactly what I was looking for.
fyi, HTML won't show in REPL which outputs <IPython.core.display.HTML object>
fyi, doesn't display in a for loop without display(), e.g., display(HTML(df.to_html(index=False)))
@Greg Legitimate. Also if you want to display several dataframes side by side (left-to-right instead of up-to-down), you might consider a technique from this answer
Note this only works under Jupyter. If you do it in console, it'll be ignored.
50
print(df.to_csv(sep='\t', index=False))

Or possibly:

print(df.to_csv(columns=['A', 'B', 'C'], sep='\t', index=False))

This works because df.to_csv returns a string when a save filepath isn't provided - see docs.

3 Comments

How is this possible as DataFrame.to_csv does not have a return value? I get only None printed out.
Indeed, OP asked to print. This comment doesn't print the dataframe, but saves it to CSV instead.
@jungrhew, @Paul - please note my edit of the answer which clarifies that .to_csv can actually return a string, as described in documentation linked to.
23

If you want to pretty print the data frames, then you can use tabulate package.

import pandas as pd
import numpy as np
from tabulate import tabulate

def pprint_df(dframe):
    print tabulate(dframe, headers='keys', tablefmt='psql', showindex=False)

df = pd.DataFrame({'col1': np.random.randint(0, 100, 10), 
    'col2': np.random.randint(50, 100, 10), 
    'col3': np.random.randint(10, 10000, 10)})

pprint_df(df)

Specifically, the showindex=False, as the name says, allows you to not show index. The output would look as follows:

+--------+--------+--------+
|   col1 |   col2 |   col3 |
|--------+--------+--------|
|     15 |     76 |   5175 |
|     30 |     97 |   3331 |
|     34 |     56 |   3513 |
|     50 |     65 |    203 |
|     84 |     75 |   7559 |
|     41 |     82 |    939 |
|     78 |     59 |   4971 |
|     98 |     99 |    167 |
|     81 |     99 |   6527 |
|     17 |     94 |   4267 |
+--------+--------+--------+

Comments

15

To answer the "How to print dataframe without an index" question, you can set the index to be an array of empty strings (one for each row in the dataframe), like this:

blankIndex=[''] * len(df)
df.index=blankIndex

If we use the data from your post:

row1 = (123, '2014-07-08 00:09:00', 1411)
row2 = (123, '2014-07-08 00:49:00', 1041)
row3 = (123, '2014-07-08 00:09:00', 1411)
data = [row1, row2, row3]
#set up dataframe
df = pd.DataFrame(data, columns=('User ID', 'Enter Time', 'Activity Number'))
print(df)

which would normally print out as:

   User ID           Enter Time  Activity Number
0      123  2014-07-08 00:09:00             1411
1      123  2014-07-08 00:49:00             1041
2      123  2014-07-08 00:09:00             1411

By creating an array with as many empty strings as there are rows in the data frame:

blankIndex=[''] * len(df)
df.index=blankIndex
print(df)

It will remove the index from the output:

  User ID           Enter Time  Activity Number
      123  2014-07-08 00:09:00             1411
      123  2014-07-08 00:49:00             1041
      123  2014-07-08 00:09:00             1411

And in Jupyter Notebooks would render as per this screenshot: Juptyer Notebooks dataframe with no index column

3 Comments

Despite being a little bit weird, this is the best solution here IMO.
can this really be the best modern solution?
I find it the best solution too as it allows to keep all other nice formating options and representation pandas has (.to_stringand the like mess the aligments etc.)
8

If you just want a string/json to print it can be solved with:

print(df.to_string(index=False))

Buf if you want to serialize the data too or even send to a MongoDB, would be better to do something like:

document = df.to_dict(orient='list')

There are 6 ways by now to orient the data, check more in the panda docs which better fits you.

Comments

5

The most simple and up-to-date way to print pandas DataFrame without index is

df.style.hide()

docs

1 Comment

Work. This should be the only accepted answer :-)
2

Taking from kingmakerking's answer:

Jupyter notebook can convert GFM Markdown table syntax into a table when you change the cell to markdown.

So, change tablefmt to 'github' instead of 'psql' and copy and paste.

    print(tabulate(dframe, headers='keys', tablefmt='github', showindex=False))

(Python 3) enter image description here

Comments

0

Similar to many of the answers above that use df.to_string(index=False), I often find it necessary to extract a single column of values in which case you can specify an individual column with .to_string using the following:

data = pd.DataFrame({'col1': np.random.randint(0, 100, 10), 
    'col2': np.random.randint(50, 100, 10), 
    'col3': np.random.randint(10, 10000, 10)})

print(data.to_string(columns=['col1'], index=False)

print(data.to_string(columns=['col1', 'col2'], index=False))

Which provides an easy to copy (and index free) output for use pasting elsewhere (Excel). Sample output:

col1  col2    
49    62    
97    97    
87    94    
85    61    
18    55

Comments

0

Tested and worked on Jupyter Notebook:

display(table.hide_index())

Comments

-1

Use df.set_index('User ID'). It is somewhat simpler than df.style.hide_index(), and a lot simpler than converting it to a string. In particular, it is simpler than converting it to HTML.

1 Comment

This changes the index, not hides it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.