Python 如何水平连接2个数据帧(行和列)?
我有两个数据帧 df1 df2 我的预期产出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(),但
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