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.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.