熊猫离开加入到位

use*_*167 2 python merge left-join pandas

我有一个大数据框df和一个小数据框,df_right有 2 列ab. 我想在a不复制的情况下进行简单的左连接/查找df

我想出了这段代码,但我不确定它有多健壮:

dtmp = pd.merge(df[['a']], df_right, on = 'a', how = "left")  #one col left join
df['b'] = dtmp['b'].values
Run Code Online (Sandbox Code Playgroud)

我知道当有重复的键时它肯定会失败:pandas left join - 为什么会有更多的结果?

有没有更好的方法来做到这一点?

有关的:

外部合并熊猫中的两个数据框

DataFrame.merge() 中 copy=False 的确切缺点是什么?

gyo*_*oza 5

你快到了。有4种情况需要考虑:

  1. 双方dfdf_right 没有有重复键
  2. 只有df 具有重复键
  3. 只有df_right 具有重复键
  4. 双方dfdf_right 复制的钥匙

您的代码在第 3 和第 4 种情况下失败,因为合并扩展了df. 为了使其工作,您需要在df_right合并之前选择要放入的信息。这样做的目的是将任何合并方案强制为情况 1 或 2。

例如,如果您希望为 中的每个重复键保留“第一个”值df_right,以下代码适用于上述所有 4 种情况。

dtmp = pd.merge(df[['a']], df_right.drop_duplicates('a', keep='first'), on='a', how='left')
df['b'] = dtmp['b'].values
Run Code Online (Sandbox Code Playgroud)

或者,如果列'b'df_right数值组成,你希望有汇总统计:

dtmp = pd.merge(df[['a']], df_right.groupby('a').mean().reset_index(drop=False), on='a', how='left')
df['b'] = dtmp['b'].values
Run Code Online (Sandbox Code Playgroud)