Python 如何水平连接2个数据帧(行和列)?

Python 如何水平连接2个数据帧(行和列)?,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧 df1 df2 我的预期产出 Cols/Rows A A2 B B2 C C2 0 A 50 50 150 150 200 200 1 B 200 200 250 300 300 300 2 C 350 370 400 400 450 450 我想创建新的数据帧,合并col和row wise。我试图使用merge(),但

我有两个数据帧

df1

df2

我的预期产出

  Cols/Rows    A    A2    B     B2    C    C2
0         A   50    50   150    150  200   200
1         B  200    200  250    300  300   300
2         C  350    370  400    400  450   450
我想创建新的数据帧,合并col和row wise。我试图使用
merge()
,但没有成功

print(df2.merge(df1, how='left'))
首先使用左连接和参数
后缀
,然后使用变更单的列名称:

最后,如果需要添加差异,则最好使用更改的新列,因为需要减去按第一列对齐的列:

df1 = df1.set_index('Cols/Rows')
df2 = df2.set_index('Cols/Rows')
df3 = df2.sub(df1)

df = df2.join(df1.add_suffix(2)).join(df3.add_suffix(3))
print (df)
             A    B    C   A2   B2   C2  A3  B3  C3
Cols/Rows                                          
A           50  150  200   50  150  200   0   0   0
B          200  300  300  200  250  300   0  50   0
C          370  400  450  350  400  450  20   0   0

def mygen(lst):
    for item in lst:
        yield item
        yield item + '2'
        yield item + '3'

df = df[list(mygen(df1.columns))].reset_index()
print (df)
  Cols/Rows    A   A2  A3    B   B2  B3    C   C2  C3
0         A   50   50   0  150  150   0  200  200   0
1         B  200  200   0  300  250  50  300  300   0
2         C  370  350  20  400  400   0  450  450   0

您可以对齐索引并使用
pd.DataFrame.join

res = df1.set_index('Cols/Rows')\
         .join(df2.set_index('Cols/Rows').add_suffix(2))

print(res)

             A    B    C   A2   B2   C2
Cols/Rows                              
A           50  150  200   50  150  200
B          200  250  300  200  300  300
C          350  400  450  370  400  450

使用
reset\u index
作为将索引提升为系列的最后一步。

merge
具有
后缀

df1.merge(df2,on='Cols/Rows',suffixes =['','2'],how='left')
Out[225]: 
  Cols/Rows    A    B    C   A2   B2   C2
0         A   50  150  200   50  150  200
1         B  200  250  300  200  300  300
2         C  350  400  450  370  400  450

不知道为什么我会得到
keyrerror:“Cols/Rows”
即使我已经检查并传递了正确的列名,Aahh,明白了,我们可以像
A2 B B2
那样重新排列列吗?我不想失去顺序,是的,我们可以对列进行排序,但在现实世界中,列可能是
Trade Trade 2 All All 2
我的全部想法是得到数字
A-A2
之间的差异,是的,这就是全部想法,但我想一步一步来step@TarunK-增加了不同列的解决方案
df1 = df1.set_index('Cols/Rows')
df2 = df2.set_index('Cols/Rows')
df3 = df2.sub(df1)

df = df2.join(df1.add_suffix(2)).join(df3.add_suffix(3))
print (df)
             A    B    C   A2   B2   C2  A3  B3  C3
Cols/Rows                                          
A           50  150  200   50  150  200   0   0   0
B          200  300  300  200  250  300   0  50   0
C          370  400  450  350  400  450  20   0   0

def mygen(lst):
    for item in lst:
        yield item
        yield item + '2'
        yield item + '3'

df = df[list(mygen(df1.columns))].reset_index()
print (df)
  Cols/Rows    A   A2  A3    B   B2  B3    C   C2  C3
0         A   50   50   0  150  150   0  200  200   0
1         B  200  200   0  300  250  50  300  300   0
2         C  370  350  20  400  400   0  450  450   0
res = df1.set_index('Cols/Rows')\
         .join(df2.set_index('Cols/Rows').add_suffix(2))

print(res)

             A    B    C   A2   B2   C2
Cols/Rows                              
A           50  150  200   50  150  200
B          200  250  300  200  300  300
C          350  400  450  370  400  450
df1.merge(df2,on='Cols/Rows',suffixes =['','2'],how='left')
Out[225]: 
  Cols/Rows    A    B    C   A2   B2   C2
0         A   50  150  200   50  150  200
1         B  200  250  300  200  300  300
2         C  350  400  450  370  400  450