熊猫加入具有不同名称的列[重复]
Posted
技术标签:
【中文标题】熊猫加入具有不同名称的列[重复]【英文标题】:Pandas join on columns with different names [duplicate] 【发布时间】:2017-03-26 23:48:57 【问题描述】:我有两个不同的数据框,我想对其执行一些 sql 操作。不幸的是,就像我正在使用的数据一样,拼写通常是不同的。
请参阅下面的示例,我认为语法看起来像 userid 属于 df1 和 username 属于 df2 的示例。有人帮我吗?
# not working - I assume some syntax issue?
pd.merge(df1, df2, on = [['userid'=='username', 'column1']], how = 'left')
【问题讨论】:
【参考方案1】:名称不同时,使用xxx_on
参数代替on=
:
pd.merge(df1, df2, left_on= ['userid', 'column1'],
right_on= ['username', 'column1'],
how = 'left')
【讨论】:
【参考方案2】:另一种方法是使用join
将右侧DataFrame
的索引设置为['username', 'column1']
列:
df1.join(df2.set_index(['username', 'column1']), on=['userid', 'column1'], how='left')
join
的输出 合并来自两个不同命名的键列 userid
和 username
的匹配键,合并成一个以 df1
的键列命名的列, userid
;而merge
的输出将两者保持为单独的列。为了说明,请考虑以下示例:
import numpy as np
import pandas as pd
df1 = pd.DataFrame('ID': [1,2,3,4,5,6], 'pID' : [21,22,23,24,25,26], 'Values' : [435,33,45,np.nan,np.nan,12])
## ID Values pID
## 0 1 435.0 21
## 1 2 33.0 22
## 2 3 45.0 23
## 3 4 NaN 24
## 4 5 NaN 25
## 5 6 12.0 26
df2 = pd.DataFrame('ID' : [4,4,5], 'pid' : [24,25,25], 'Values' : [544, 545, 676])
## ID Values pid
## 0 4 544 24
## 1 4 545 25
## 2 5 676 25
pd.merge(df1, df2, how='left', left_on=['ID', 'pID'], right_on=['ID', 'pid']))
## ID Values_x pID Values_y pid
## 0 1 435.0 21 NaN NaN
## 1 2 33.0 22 NaN NaN
## 2 3 45.0 23 NaN NaN
## 3 4 NaN 24 544.0 24.0
## 4 5 NaN 25 676.0 25.0
## 5 6 12.0 26 NaN NaN
df1.join(df2.set_index(['ID','pid']), how='left', on=['ID','pID'], lsuffix='_x', rsuffix='_y'))
## ID Values_x pID Values_y
## 0 1 435.0 21 NaN
## 1 2 33.0 22 NaN
## 2 3 45.0 23 NaN
## 3 4 NaN 24 544.0
## 4 5 NaN 25 676.0
## 5 6 12.0 26 NaN
这里,我们还需要在join
中指定lsuffix
和rsuffix
,以区分输出中的重叠列Value
。可以看到,merge
的输出包含来自右侧DataFrame
的额外pid
列,鉴于合并的上下文,恕我直言,这是不必要的。另请注意,pid
列的 dtype
已更改为 float64
,这是由于从不匹配的行引入的 NaN
s 导致向上转换的结果。
这种美学输出是以牺牲性能为代价的,因为调用右侧的set_index
DataFrame
会产生一些开销。但是,快速而肮脏的配置文件表明这并不算太可怕,大致30%
,这可能是值得的:
sz = 1000000 # one million rows
df1 = pd.DataFrame('ID': np.arange(sz), 'pID' : np.arange(0,2*sz,2), 'Values' : np.random.random(sz))
df2 = pd.DataFrame('ID': np.concatenate([np.arange(sz/2),np.arange(sz/2)]), 'pid' : np.arange(0,2*sz,2), 'Values' : np.random.random(sz))
%timeit pd.merge(df1, df2, how='left', left_on=['ID', 'pID'], right_on=['ID', 'pid'])
## 818 ms ± 33.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df1.join(df2.set_index(['ID','pid']), how='left', on=['ID','pID'], lsuffix='_x', rsuffix='_y')
## 1.04 s ± 18.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
【讨论】:
以上是关于熊猫加入具有不同名称的列[重复]的主要内容,如果未能解决你的问题,请参考以下文章