合并具有分层列的两个DataFrame

You*_*rof 9 python pandas

我想合并两个DataFrame,同时创建一个多级列命名方案,表示行来自哪个数据帧.例如:

In [98]: A=pd.DataFrame(np.arange(9.).reshape(3,3),columns=list('abc'))
In [99]: A
Out[99]: 
   a  b  c
0  0  1  2
1  3  4  5
2  6  7  8

In [100]: B=A.copy()
Run Code Online (Sandbox Code Playgroud)

如果我使用pd.merge(),那我就明白了

In [104]: pd.merge(A,B,left_index=True,right_index=True)
Out[104]: 
   a_x  b_x  c_x  a_y  b_y  c_y
0    0    1    2    0    1    2
1    3    4    5    3    4    5
2    6    7    8    6    7    8
Run Code Online (Sandbox Code Playgroud)

这是我对该声明的期望,我想要的是什么(但我不知道如何获得!)是:

In [104]: <<one or more statements>>
Out[104]: 
     A              B
     a    b    c    a    b    c
0    0    1    2    0    1    2
1    3    4    5    3    4    5
2    6    7    8    6    7    8
Run Code Online (Sandbox Code Playgroud)

这可以在改变原始pd.DataFrame呼叫的情况下完成吗?我正在从.csv文件中读取数据框中的数据,这可能是我的问题.

Jef*_*eff 7

第一种情况可以在A,B之间任意排序(不是列,只是顺序A或B)第二种情况可以保留排序

恕我直言这是潘东人!

In [5]: concat(dict(A = A, B = B),axis=1)
Out[5]: 
   A        B      
   a  b  c  a  b  c
0  0  1  2  0  1  2
1  3  4  5  3  4  5
2  6  7  8  6  7  8

In [6]: concat([ A, B ], keys=['A','B'],axis=1)
Out[6]: 
   A        B      
   a  b  c  a  b  c
0  0  1  2  0  1  2
1  3  4  5  3  4  5
2  6  7  8  6  7  8
Run Code Online (Sandbox Code Playgroud)

  • 如果有人感到困惑,这个答案中的“concat”是“pd.concat()”。 (2认同)

And*_*den 6

这是一种改变A和B的方法:

In [10]: from itertools import cycle

In [11]: A.columns = pd.MultiIndex.from_tuples(zip(cycle('A'), A.columns))

In [12]: A
Out[12]:
   A
   a  b  c
0  0  1  2
1  3  4  5
2  6  7  8

In [13]: B.columns = pd.MultiIndex.from_tuples(zip(cycle('B'), B.columns))

In [14]: A.join(B)
Out[14]:
   A        B
   a  b  c  a  b  c
0  0  1  2  0  1  2
1  3  4  5  3  4  5
2  6  7  8  6  7  8
Run Code Online (Sandbox Code Playgroud)

我实际上认为这将是一个很好的替代行为,而不是后缀......

  • 如果没有更多的方法来做这个ATM,那么我就是+1,因为它是一个原生的关键字控制选项.(看看我的广告系列有多么微妙?也许我应该在PyCon或其他地方发贴贴纸.:^) (2认同)