【问题标题】:how to identify whats NOT in the inner join during dataframe merge如何在数据框合并期间识别内部联接中的内容
【发布时间】:2017-03-23 22:51:07
【问题描述】:

我有一帧看起来像这样 (df):

2000 季度 1 2000 季度 2 2000 季度 3 州地区名称 纽约 纽约 NaN NaN NaN 加利福尼亚 洛杉矶 207066.666667 214466.666667 220966.666667 伊利诺伊州芝加哥 138400.000000 143633.333333 147866.666667

(注意这里的 State,RegionName 是一个 MultiIndex)

一帧看起来像这样(ut):

州地区名称 0 阿拉巴马州奥本 1 阿拉巴马州佛罗伦萨 2 阿拉巴马州杰克逊维尔 3 阿拉巴马州利文斯顿 4 阿拉巴马州蒙特瓦罗

所以要获取两个数据帧中包含 State、RegionName 的所有行,我这样做:

dfut = pd.merge(df, ut, how='inner', left_index=True, right_on=['State', 'RegionName'])

这行得通。我现在想要一个行列表,其中 df 框架中的行不在 ut 框架中——比如“非内连接”。我很确定我需要做一个左连接,这会给我整个 df,但我不知道如何从中减去 ut 相交的行。希望它清楚。谢谢

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    没有query有一个更简单的方法

    您想对dfut 进行内部合并以获取所有 df 的“匹配”索引(即,ut 中的 df 的索引)

    inner_merge_index = pd.merge(df.reset_index(), ut, how='inner').set_index(['State', 'RegionName']).index
    

    然后,您想从df 中删除所有这些匹配的索引

    dfut = df.drop(list(inner_merge_index))
    

    请注意,这也适用于 MultiIndex。要对其进行测试,您可能希望通过添加在执行内部合并时实际保留的行(在下面添加“Alabama”/“Jacksonville”)来扩展您的测试df(因为它与ut 有0 个交集)。如果您对其进行测试,您将看到这是唯一被删除的行。

    df = pd.DataFrame([['New York', 'New York', 'NaN', 'NaN', 'NaN'],
                       ['California', 'Los Angeles', '207066.666667', '214466.666667', '220966.666667'],
                       ['Illinois', 'Chicago', '138400.000000', '143633.333333', '147866.666667'],
                       ['Alabama', 'Jacksonville', '98765.000000', '54321.333333', '12345.0']],
                      columns=['State', 'RegionName', '2000q1', '2000q2', '2000q3']).set_index(['State', 'RegionName'])
    

    【讨论】:

      【解决方案2】:

      在您的mergequery('_merge != "both"') 中包含参数indicator=True

      dfut = pd.merge(df, ut, how='outer',
                      left_index=True, right_on=['State', 'RegionName'],
                      indicator=True)
      
      dfut.query('_merge != "both"')
      

      【讨论】:

      • 这是最好的方法吗?似乎是一种解决方法
      • 虽然大约 3 年后我可能会想出一个更漂亮的解决方案,但这不是一个变通办法。
      猜你喜欢
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多