2024-05-12 21:57:45 发布
网友
我有两个不同的数据帧,我想对它们执行一些sql操作。不幸的是,和我正在处理的数据一样,拼写常常不同。
下面是一个示例,其中userid属于df1,username属于df2。有人帮我吗?
# not working - I assume some syntax issue? pd.merge(df1, df2, on = [['userid'=='username', 'column1']], how = 'left')
另一种方法是使用join将右侧的索引DataFrame设置为列['username', 'column1']:
join
DataFrame
['username', 'column1']
df1.join(df2.set_index(['username', 'column1']), on=['userid', 'column1'], how='left')
这个join的输出将来自两个不同命名的键列userid和username的匹配键合并到一个以df1,userid键列命名的列中,而merge的输出将这两个列保持为单独的列。为了说明这一点,请考虑以下示例:
userid
username
df1
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而进行的上推。
lsuffix
rsuffix
Value
pid
dtype
float64
NaN
这种美观的输出是以性能上的代价获得的,因为调用右边的set_index会产生一些开销。然而,一个快速而肮脏的配置文件显示,这并不太可怕,大致上是30%,这可能是值得的:
set_index
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)
当名称不同时,使用xxx_on参数而不是on=:
xxx_on
on=
pd.merge(df1, df2, left_on= ['userid', 'column1'], right_on= ['username', 'column1'], how = 'left')
另一种方法是使用
join
将右侧的索引DataFrame
设置为列['username', 'column1']
:这个
join
的输出将来自两个不同命名的键列userid
和username
的匹配键合并到一个以df1
,userid
键列命名的列中,而merge
的输出将这两个列保持为单独的列。为了说明这一点,请考虑以下示例:这里,我们还需要在
join
中指定lsuffix
和rsuffix
,以区分输出中的重叠列Value
。如您所见,merge
的输出包含来自右侧DataFrame
的额外pid
列,考虑到合并的上下文,这是不必要的。还请注意,pid
列的dtype
已更改为float64
,这是由于从不匹配行引入的NaN
而进行的上推。这种美观的输出是以性能上的代价获得的,因为调用右边的
set_index
会产生一些开销。然而,一个快速而肮脏的配置文件显示,这并不太可怕,大致上是30%
,这可能是值得的:当名称不同时,使用
xxx_on
参数而不是on=
:相关问题 更多 >
编程相关推荐