我试图使用公共列(日期时间)合并两个熊猫数据帧(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
任何帮助将不胜感激。
答案 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列