如何将两个数据框水平连接(按行和列)?

4

I have 2 dataframes

df1

  Cols/Rows   A    B    C
0         A   50  150  200
1         B  200  250  300
2         C  350  400  450

df2

  Cols/Rows    A    B    C
0         A   50  150  200
1         B  200  300  300
2         C  370  400  450

我的期望输出

  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

我想创建一个新的数据框,将列和行合并。我尝试使用merge(),但它没有起作用。

print(df2.merge(df1, how='left'))
3个回答

5

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

4

首先使用带有左连接和参数suffixesmerge,然后使用这个完美的解决方案来更改列名的顺序:

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

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

#first column removed by indexing
cols = ['Cols/Rows'] + list(mygen(df1.columns[1:]))
df = df[cols]
print (df)
  Cols/Rows    A   A2    B   B2    C   C2
0         A   50   50  150  150  200  200
1         B  200  200  300  250  300  300
2         C  370  350  400  400  450  450

最后,如果需要添加不同的新列,最好使用改变jpp解决方案,因为需要通过第一列对齐的列进行减法操作。
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

尽管我已经检查并传递了正确的列名,但我不确定为什么会出现“KeyError:'Cols/Rows'”。 - Tarun K
啊,明白了,我们也可以重新排列列,比如 A A2 B B2,我不想失去顺序。是的,我们可以对列进行排序,但在现实世界中,列可能是 Trade Trade2 All All2 - Tarun K
我的整个想法是获取数字 A - A2 之间的差异。 - Tarun K
是的,这就是整个想法,但我想一步一步地进行。 - Tarun K
@TarunK - 添加了解决列差异的解决方案。 - jezrael

4
您可以对齐索引,然后使用 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_index作为最后一步,将索引提升为一个系列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接