How to Display Two Pandas Dataframes side by side in Jupyter Notebook

In this brief tutorial, we'll see how to display two and more DataFrames side by side in Jupyter Notebook.

To start let's create two example DataFrames:

import pandas as pd
df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz'],
                    'value': [1, 2, 3]})

df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz'],
                    'value': [5, 6, 7]})

df1:

lkey value
0 foo 1
1 bar 2
2 baz 3

df2:

rkey value
0 foo 5
1 bar 6
2 baz 7

Solution 1: Display two DataFrames side by side pure Pandas solution (with title)

The first option for rendering two DataFrames side by side is to change Pandas styling methods. This solution is available since Pandas 0.17. With this method you can set titles for your DataFrames.

First we will create Styler object with:

  • use method set_table_attributes in order to set "style='display:inline'"
  • add title for each DataFrame:
import pandas as pd   
from IPython.display import display_html 


df1_styler = df1.style.set_table_attributes("style='display:inline'").set_caption('df1')
df2_styler = df2.style.set_table_attributes("style='display:inline'").set_caption('df2')
df2_t_styler = df2.T.style.set_table_attributes("style='display:inline'").set_caption('df2_t')

display_html(df1_styler._repr_html_()+df2_styler._repr_html_(), raw=True)
display_html(df1_styler._repr_html_()+df2_styler._repr_html_() +df2_t_styler._repr_html_(), raw=True)

result:

If you like to add space between DataFrames you can use:

space = "\xa0" * 10
display_html(df1_styler._repr_html_()+ space  + df2_styler._repr_html_(), raw=True)

Solution 2: Render DataFrames side by side by CSS override - with index

The simplest solution is to change the CSS for the output cells - this will align the DataFrames next to each other . You need to change flex-direction:

from IPython.display import display, HTML

css = """
.output {
    flex-direction: row;
}
"""

HTML('<style>{}</style>'.format(css))

Then you can display two and more DataFrames side by side by:

display(df1)
display(df2)
display(df1)

Result:

Solution 3: Display two DataFrame by Pandas merge - without index

If data in both DataFrames is related you can use Pandas merge on one or more columns and combine them in one DataFrame. This can be done by next code:

df1.merge(df2, left_on='lkey', right_on='rkey', suffixes=('_df1', '_df2'))

result:

lkey value_df1 rkey value_df2
0 foo 1 foo 5
1 bar 2 bar 6
2 baz 3 baz 7

Solution 4: Display two DataFrame by Pandas concat - without index

The final option is to use Pandas concat on both and display the output. Again this will work only on similar DataFrames:

pd.concat([d.reset_index(drop=True) for d in [df1, df2]], axis=1)

result:

lkey value rkey value
0 foo 1 foo 5
1 bar 2 bar 6
2 baz 3 baz 7