我正在尝试使用一个公共列(datetime)合并两个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 103DF-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
任何帮助都将不胜感激。
发布于 2018-09-19 00:22:44
您可以使用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--编辑--我发现这种过滤复制列的方式很有用,因为你可以有任意数量的复制列,它会把它们去掉。您不必显式传递要保留的列名
发布于 2018-09-19 00:00:27
您可以在merge中过滤该列
pd.merge(left=DF1,right=DF2[['datetime','col2']], how='left', left_on='datetime', right_on='datetime')发布于 2018-09-19 00:05:04
您可以创建一个包含所有'_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列
https://stackoverflow.com/questions/52390471
复制相似问题