Python 用分层列连接两个数据帧

Python 用分层列连接两个数据帧,python,pandas,Python,Pandas,我想合并两个数据帧,同时创建一个多级列命名方案,指明行来自哪个数据帧。例如: 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() 如果我使用pd.merge(),那么 In [104]: pd.merge(A,B,left_inde

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

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()
如果我使用
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
这就是我对这句话的期望,我想要的(但我不知道如何得到!)是:

[104]中的

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

这可以在不更改原始的
pd.DataFrame
调用的情况下完成吗?我正在从.csv文件中读取数据帧中的数据,这可能是我的问题。

这里有一种方法,它确实改变了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

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

第一种情况可以在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

如果没有更多的pandorable*方法来实现这个ATM,那么我将+1用于使它成为本地关键字控制选项。(看看我的竞选活动有多微妙?也许我应该在PyCon或其他什么地方分发贴纸。^)@DSM wooo,PyCon!谢谢你提醒我:我有票了D@DSM你应该看看杰夫的解决方案,好多了!如果有人感到困惑,
concat
在这个答案中是
pd.concat()
。嗨!如果我需要在某些列上设置逻辑,比如在
pd.merge(A,B,on='c')
中,但是A和B有层次结构的列(给我一个
KeyError
)。如果A&B中没有层次列,它将返回带有后缀的列名,但我希望结果中的层次列在列名中没有后缀。这可能吗?回答我自己的问题:合并A和B并保留层次结构列,避免在我使用的列中使用后缀:(列“时间”上的内部联接)
dfs=[A,B];对于dfs中的df:df.set_index('time',inplace=True);df=pd.concat(dfs,axis=1,join='internal',key='A',B')
标题合适吗?因为您的答案只是一个
concat
而不是一个
merge
。标题不应该是“连接两个数据帧…”吗@Lukas是的。我刚做了改变。很抱歉…直到你的评论出来我才记得问过这个问题。
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