ntjess
ntjess

Reputation: 1460

Name group of columns and rows in Pandas DataFrame

I would like to give a name to groups of columns and rows in my Pandas DataFrame to achieve the same result as a merged Excel table:

enter image description here

However, I can't find any way to give an overarching name to groups of columns/rows like what is shown.

I tried wrapping the tables in an array, but the dataframes don't display:

labels = ['a', 'b', 'c']
df = pd.DataFrame(np.ones((3,3)), index=labels, columns=labels)
labeledRowsCols = pd.DataFrame([df, df])
labeledRowsCols = pd.DataFrame(labeledRowsCols.T, index=['actual'], columns=['predicted 1', 'predicted 2'])
print(labeledRowsCols)
         predicted 1  predicted 2
 actual          NaN          NaN

Upvotes: 2

Views: 1969

Answers (1)

James
James

Reputation: 36691

You can set hierarchical indices for both the rows and columns.

import pandas as pd

df = pd.DataFrame([[3,1,0,3,1,0],[0,3,0,0,3,0],[2,1,3,2,1,3]])

col_ix = pd.MultiIndex.from_product([['Predicted: Set 1', 'Predicted: Set 2'], list('abc')]) 
row_ix = pd.MultiIndex.from_product([['True label'], list('abc')])
df = df.set_index(row_ix)
df.columns = col_ix

df
# returns:
             Predicted: Set 1       Predicted: Set 2
                      a  b  c                a  b  c
True label a          3  1  0                3  1  0
           b          0  3  0                0  3  0
           c          2  1  3                2  1  3

Exporting this to Excel should have the merged cells as in your example.

Upvotes: 4

Related Questions