【问题标题】:Pandas, joining null values熊猫,加入空值
【发布时间】:2020-12-06 22:38:42
【问题描述】:

我正在尝试使用 pandas 复制 SQL 连接,但连接键中的 Null 值出现问题。 例如数据框:

df_1 = pd.DataFrame({'K1':[1,2,3, 2], 
                     'K2':['a', 'b', 'c', np.nan], 
                     'K3':'x y z y'.split()})
df_2 = pd.DataFrame({'Z1':[1, 2, 2, 3], 
                     'Z2':['a', np.nan, np.nan, 'c'], 
                     'Z3':'x y y z'.split(), 'I':[10, 40, 50, 20]})

可以使用:

df_join = pd.merge(df_1, df_2, left_on=['K1', 'K2', 'K3'], right_on=['Z1', 'Z2', 'Z3'], how='inner')

哪个输出:

我认为这在“技术上”是正确的,因为 K2 和 Z2 中都存在空值,但是在 SQL 中,这些空值不被识别为匹配项。因此,对于 K1 = 2,“I”列应该是 NaN。

在我的情况下,我使用列“I”值来进行另一次计算,因此我添加了修复它:

df_join.loc[df_join['K2'].isna(), 'I'] = np.nan
df_join.drop_duplicates()

但感觉不对。有没有办法在合并操作中直接复制 SQL 行为或更清晰的方式?

【问题讨论】:

标签: python sql pandas join


【解决方案1】:

如果您不希望 NaN 出现在合并结果中,您可以先将它 (.dropna()) 放在每个 df 上:

df_join = pd.merge(df_1.dropna(), df_2.dropna(), left_on=['K1', 'K2', 'K3'], right_on=['Z1', 'Z2', 'Z3'], how='inner')
    K1  K2  K3  Z1  Z2  Z3  I
0   1   a   x   1   a   x   10
1   3   c   z   3   c   z   20

【讨论】:

    【解决方案2】:

    如果您告诉您的数据框在具有 NaN 的键上合并,他会假设您要在两个键都是 NaN 时进行合并,并且在这种情况下只使用 1 或 2 个键。

    如果您不想合并在这些列上具有 NaN 的任何内容,则首先在您的键列上应用 dropna() 方法。

    所以:

    df_join = pd.merge(df_1.dropna(subset=['K1','K2','K3']), df_2.dropna(subset=['Z1','Z2','Z3']), left_on=['K1', 'K2', 'K3'], right_on=['Z1', 'Z2', 'Z3'], how='inner')
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-25
      • 2018-06-20
      • 2022-12-26
      • 2014-09-21
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多