根据列比较合并两个熊猫数据框,并跳过右边的公共列

时间:2018-09-18 15:56:44

标签: python pandas

我试图使用公共列(日期时间)合并两个熊猫数据帧(DF-1和DF-2)(我从csv文件导入了两个数据帧)。我想将DF-2中的非公共列添加到DF-1中,而忽略DF-2中的所有公共列。

DF-1

date       time  open   high   low    close      datetime         col1            
2018-01-01 09:15  11    14     17     20     2018-01-01 09:15:00  101
2018-01-01 09:16  12    15     18     21     2018-01-01 09:16:00  102
2018-01-01 09:17  13    16     19     22     2018-01-01 09:17:00  103

DF-2

date       time  open   high   low    close      datetime         col2            
2018-01-01 09:15 23     26     29     32     2018-01-01 09:15:00  104
2018-01-01 09:16 24     27     30     33     2018-01-01 09:16:00  105
2018-01-01 09:17 25     28     31     34     2018-01-01 09:17:00  106

合并的DF(我要)

date       time  open   high   low    close   datetime          col1   col2        
2018-01-01 09:15  11    14     17     20   2018-01-01 09:15:00  101    104
2018-01-01 09:16  12    15     18     21   2018-01-01 09:16:00  102    105
2018-01-01 09:17  13    16     19     22   2018-01-01 09:17:00  103    106

使用的代码: merged_left = pd.merge(left=DF1,right=DF2, how='left', left_on='datetime', right_on='datetime')

我得到的是: 是否将两个框架内的数据与命名为通用列的合并 time_x,open_x,high_x,low_x,close_x,time_y,open_y,high_y,low_y,close_y,col1,col2

我想忽略所有_y列并保留_x

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以使用suffixes来确保第二个数据帧具有以某种方式命名的重复列。然后,您可以使用filter

过滤列
>>> df1
   a  b
0  1  2
>>> df2
   a  b  c
0  1  2  3
>>> df1.merge(df2, on=['a'], suffixes=['', '_y'])
   a  b  b_y  c
0  1  2    2  3
>>> df1.merge(df2, on=['a'], how='left', suffixes=['', '_y']).filter(regex='^(?!_y).$', axis=1)
   a  b  c
0  1  2  3

-编辑- 我发现以这种方式过滤dupe列很有用,因为您可以有任意数量的dupes,它将把它们删除。您不必显式传递要保留的列名称

答案 1 :(得分:2)

您可以过滤merge

中的列
pd.merge(left=DF1,right=DF2[['datetime','col2']], how='left', left_on='datetime', right_on='datetime')

答案 2 :(得分:0)

您可以使用所有'_y'列创建列表理解,然后将其传递到pandas.drop

drop_labels = [col for col in merged_left.columns if col.find('_y') > 0]
merged_left.drop(drop_labels,axis = 1,inplace = True)

这将使您拥有所有唯一列和_x列