Pandas加入具有不同名称的列

run*_*rds 7 python sql merge pandas

我有两个不同的数据框,我想执行一些SQL操作.不幸的是,正如我正在使用的数据一样,拼写通常是不同的.

请参阅下面的示例,我认为语法看起来像userid属于df1,而username属于df2.有人帮帮我吗?

 # not working - I assume some syntax issue?
pd.merge(df1, df2, on = [['userid'=='username', 'column1']], how = 'left')
Run Code Online (Sandbox Code Playgroud)

Bou*_*oud 9

当名称不同时,请使用xxx_on参数而不是on=:

pd.merge(df1, df2, left_on=  ['userid', 'column1'],
                   right_on= ['username', 'column1'], 
                   how = 'left')
Run Code Online (Sandbox Code Playgroud)


aic*_*hao 6

另一种方法是使用join将右侧的索引设置DataFrame为列['username', 'column1']

\n\n
df1.join(df2.set_index(['username', 'column1']), on=['userid', 'column1'], how='left')\n
Run Code Online (Sandbox Code Playgroud)\n\n

其输出join 两个不同命名的键列userid和中的匹配键合并username到以 , 的键列命名的单个列中df1userid而 的输出merge将两者保留为单独的列。为了说明这一点,请考虑以下示例:

\n\n
import numpy as np\nimport pandas as pd\n\ndf1 = 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]})\n##    ID  Values  pID\n## 0   1   435.0   21\n## 1   2    33.0   22\n## 2   3    45.0   23\n## 3   4     NaN   24\n## 4   5     NaN   25\n## 5   6    12.0   26\n\ndf2 = pd.DataFrame({'ID' : [4,4,5], 'pid' : [24,25,25], 'Values' : [544, 545, 676]})\n##    ID  Values  pid\n## 0   4     544   24\n## 1   4     545   25\n## 2   5     676   25\n\npd.merge(df1, df2, how='left', left_on=['ID', 'pID'], right_on=['ID', 'pid']))\n##    ID  Values_x  pID  Values_y   pid\n## 0   1     435.0   21       NaN   NaN\n## 1   2      33.0   22       NaN   NaN\n## 2   3      45.0   23       NaN   NaN\n## 3   4       NaN   24     544.0  24.0\n## 4   5       NaN   25     676.0  25.0\n## 5   6      12.0   26       NaN   NaN\n\ndf1.join(df2.set_index(['ID','pid']), how='left', on=['ID','pID'], lsuffix='_x', rsuffix='_y'))\n##    ID  Values_x  pID  Values_y\n## 0   1     435.0   21       NaN\n## 1   2      33.0   22       NaN\n## 2   3      45.0   23       NaN\n## 3   4       NaN   24     544.0\n## 4   5       NaN   25     676.0\n## 5   6      12.0   26       NaN\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里,我们还需要指定lsuffixand rsuffixin来区分输出中的join重叠列。Value正如我们所看到的, 的输出包含右侧的merge额外列,恕我直言,考虑到合并的上下文,这是不必要的。另请注意,该列的已更改为,这是由于从不匹配的行引入了 s 而导致的向上转换。pidDataFramedtypepidfloat64NaN

\n\n

set_index这种美观的输出是以性能为代价的,因为对右侧的调用DataFrame会产生一些开销。然而,快速而肮脏的配置文件表明,这并不太可怕,粗略地说30%,这可能是值得的:

\n\n
sz = 1000000 # one million rows\ndf1 = pd.DataFrame({'ID': np.arange(sz), 'pID' : np.arange(0,2*sz,2), 'Values' : np.random.random(sz)})\ndf2 = 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)})\n\n%timeit pd.merge(df1, df2, how='left', left_on=['ID', 'pID'], right_on=['ID', 'pid'])\n## 818 ms \xc2\xb1 33.4 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n%timeit df1.join(df2.set_index(['ID','pid']), how='left', on=['ID','pID'], lsuffix='_x', rsuffix='_y')\n## 1.04 s \xc2\xb1 18.2 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n