【问题标题】:Pandas conditional join熊猫有条件加入
【发布时间】:2022-01-16 08:42:36
【问题描述】:

我有一个像下面这样的df

df = pd.DataFrame([[1,1], [2,1], [3,1], [1,2], [2,2], [3,2]], columns = ['Var1', 'Var2'])

Var1    Var2
1       1
2       1
3       1
1       2
2       2
3       2

我想合并 df 并创建一个新变量。在 SQL 中,我将通过以下语句实现它

 a.*
,b.var2 as Var3
from df as a
left join
df as b
on a.var1 = b.var1 and a.var2+1 = b.var2

要达到以下效果

Var1    Var2    Var3
1       1       2
2       1       2
3       1       2
1       2   
2       2   
3       2   

在 pandas 中尝试执行此操作时,我使用以下语句

df['Var3'] = df.merge(df['Var2'], how='left', left_on=['Var1', 'Var2'+1], right_on=['Var1', 'Var2'])

但是它向我抛出了下面的错误,因为它认为我想连接“Var2”而不是向它添加 +1。

TypeError: can only concatenate str (not "int") to str 

如何在 pandas 的数据框上实现这种条件连接?

谢谢!

【问题讨论】:

    标签: python sql pandas


    【解决方案1】:

    试试这个:

    df['Var3'] = df.assign(tmp=df['Var2']+1).merge(df, how='left', left_on=['Var1', 'tmp'], right_on=['Var1', 'Var2'])['Var2_y']
    

    输出:

    >>> df
       Var1  Var2  Var3
    0     1     1   2.0
    1     2     1   2.0
    2     3     1   2.0
    3     1     2   NaN
    4     2     2   NaN
    5     3     2   NaN
    

    df.assign(tmp=df['Var2']+1) 创建一个临时列,其中包含所有Var2 加一的值。您不能在 Python 中使用 let_on=['Var1', 'Var2' + 1],因此您可以使用 assign 技巧。

    Var2_y的解释:

    合并后的中间数据帧如下所示:

    >>> df.assign(tmp=df['Var2']+1).merge(df, how='left', left_on=['Var1', 'tmp'], right_on=['Var1', 'Var2'])
       Var1  Var2_x  tmp  Var2_y
    0     1       1    2     2.0
    1     2       1    2     2.0
    2     3       1    2     2.0
    3     1       2    3     NaN
    4     2       2    3     NaN
    5     3       2    3     NaN
    

    有些列已经存在,所以 Pandas 不会覆盖它们,而是将新列重命名为 _x_y。我们想要的列是Var2_y 列,所以我们选择了这一列。

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2022-07-07
      • 2022-12-11
      • 1970-01-01
      • 2019-12-20
      • 2017-01-30
      • 1970-01-01
      • 2019-04-11
      • 2019-12-21
      相关资源
      最近更新 更多