我要在CCOL列上合并两个数据框:我给出一个简短的示例,如下所示:(相同名称的Cols在两个数据框中具有相同的数据)
df1 =
CCOL ColA ColB ColC ColD ColE ColF
A 1.0 a b 23 45 2.7
B 3.0 c q 26 34 5.9
C 5.0 f r 2 4.9 15.9
D 7.0 e s 45 2 8
df2 =
CCOL ColA ColB ColE ColP ColR ColS
A 1.0 a 45 vq 4 21.7
AF 7.0 za 7.9 r 4 3.1
D 7.0 e 2 gh 3 53.1
GK 8.0 ut 2 qt 4 33.3
所以我正在寻找的这两个数据帧的最终输出是:
final_df =
CCOL ColA ColB ColC ColD ColE ColF ColP ColR ColS
A 1.0 a b 23 45 2.7 vq 4 21.7
D 7.0 e s 45 2 8 gh 3 53.1
我尝试过
newdf = pd.merge(df1,df2,on='CCOL', how='inner')
但是,这是我从同一列中在新df中创建ColA_x,ColA_y等的内容,
我的尝试:
newdf = df1.combine_first(df2)
但是,这创建了一个如下数据框,该数据框为CCOL,“ A”和“ D”的行提供了正确的数据,但对于df1和df2在CCOL上不匹配的列则完全错误。
newdf =
CCOL ColA ColB ColC ColD ColE ColF ColP ColR ColS
A 1.0 a b 23 45.0 2.7 vq 4.0 21.7
B 3.0 c q 26 34.0 5.9 r 4.0 3.1
C 5.0 f r 2 4.9 15.9 gh 3.0 53.1
D 7.0 e s 45 2.0 8.0 qt 4.0 33.3
所以不了解如何实现我的输出final_df。任何帮助将不胜感激。
答案 0 :(得分:1)
几乎在那里,只需将how
参数用作'left'
并添加dropna
:
df1.merge(df2,how='left').dropna()
输出:
CCOL ColA ColB ColC ColD ColE ColF ColP ColR ColS
0 A 1.0 a b 23 45.0 2.7 vq 4.0 21.7
3 D 7.0 e s 45 2.0 8.0 gh 3.0 53.1
答案 1 :(得分:0)
好吧,所以我假设您要基于一个特定列(同时出现在df1和df2中)的值,在df1和df2的列上扩展结果df,这将标识您要扩展的行。
因此没有合并,而是在不同的轴上级联,如下面的示例所示:
df1 = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
num_legs num_wings num_specimen_seen
falcon 2 2 10
dog 4 0 2
spider 8 0 1
fish 0 0 8
df2 = pd.DataFrame({'num_legs2': [2, 4, 3, 0],
'num_wings2': [2, 7, 77, 777],
'num_specimen_seen2': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
num_legs2 num_wings2 num_specimen_seen2
falcon 2 2 10
dog 4 7 2
spider 3 77 1
fish 0 777 8
newdf = pd.concat([df1.num_legs.loc[df1.num_legs == df2.num_legs2],
df1.num_wings, df2.num_wings2],
axis=1)
print(newdf)
num_legs num_wings num_wings2
falcon 2.0 2 2
dog 4.0 0 7
fish 0.0 0 777
spider NaN 0 77
排除一行,其中num_legs!= num_legs2。我要连接的其余列在concat方法中提供
有关详情,请参见此link。
编辑: 我的结果中仍然存在难解的问题。添加
newdf = newdf[newdf2['num_legs'].notna()]
坦白地说,这个answer更好:)