5

I have a dictionary of DataFrames, where the keys are assumed to be meaningful:

In [32]: x = pd.DataFrame(dict(foo=[1,2,3], bar=[4,5,6])).set_index('foo')
In [33]: y = pd.DataFrame(dict(foo=[7,8,9], bar=[10,11,12])).set_index('foo')
In [34]: z = dict(x=x, y=y)

Which looks like:

In [43]: x
Out[43]: 
     bar
foo     
1      4
2      5
3      6

In [44]: y
Out[44]: 
     bar
foo     
7     10
8     11
9     12

Is there a nice way to get the following DataFrame:

    foo  bar
x   1    4
    2    5
    3    6
y   7    10
    8    11
    9    12

1 Answer 1

7

You can use concat for this, and the keys of the dictionary will automatically be used for a new index level:

In [6]: z = dict(x=x, y=y)

In [7]: pd.concat(z)
Out[7]:
       bar
  foo
x 1      4
  2      5
  3      6
y 7     10
  8     11
  9     12

You can also give this new index level a name using the names argument of concat (eg names=['key']).

Sign up to request clarification or add additional context in comments.

4 Comments

Every time I discover something new about pandas I love it more and more. Bonus points for the names= part too.
The names option of this yields "ValueError: Length of names must match number of levels in MultiIndex." for me.
pd.concat(z, names=['key']) works fine for me. What version of pandas are you using? If you still have a problem with, please open a new question.
pd.concat(z, names=['key']) is a nice attempt! This post is really helpful for me.

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.