首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于列比较合并两个pandas数据框并跳过右侧的公共列

基于列比较合并两个pandas数据框并跳过右侧的公共列
EN

Stack Overflow用户
提问于 2018-09-18 23:56:44
回答 3查看 132关注 0票数 0

我正在尝试使用一个公共列(datetime)合并两个pandas数据帧(DF-1和DF-2) (我从csv文件导入了这两个数据帧)。我想将DF-2中的非公共列添加到DF-1中,忽略DF-2中的所有公共列。

DF-1

代码语言:javascript
复制
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

代码语言:javascript
复制
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(我想要)

代码语言:javascript
复制
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

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2018-09-19 00:22:44

您可以使用suffixes来确保第二个数据帧具有以某种方式命名的复制列。然后可以使用filter过滤掉这些列

代码语言:javascript
复制
>>> 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

--编辑--我发现这种过滤复制列的方式很有用,因为你可以有任意数量的复制列,它会把它们去掉。您不必显式传递要保留的列名

票数 3
EN

Stack Overflow用户

发布于 2018-09-19 00:00:27

您可以在merge中过滤该列

代码语言:javascript
复制
pd.merge(left=DF1,right=DF2[['datetime','col2']], how='left', left_on='datetime', right_on='datetime')
票数 2
EN

Stack Overflow用户

发布于 2018-09-19 00:05:04

您可以创建一个包含所有'_y‘列的列表理解,然后将其传递给pandas.drop

代码语言:javascript
复制
drop_labels = [col for col in merged_left.columns if col.find('_y') > 0]
merged_left.drop(drop_labels,axis = 1,inplace = True)

这将为您留下所有唯一列和_x列

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52390471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档