【问题标题】:Pandas full outer index join with NaN for non-matching indexesPandas 全外部索引与 NaN 连接以获取非匹配索引
【发布时间】:2017-08-29 13:59:00
【问题描述】:

尝试对这两个 Pandas 数据框进行完全外连接:

df1 = pd.DataFrame({'a': [1,2,1], 'b': [1,1,2], 'c': [1,2,3]}).set_index(['a', 'b'])
df2 = pd.DataFrame({'a': [1,2,3], 'd': [11,12,13]}).set_index(['a'])

>>> df1
     c
a b   
1 1  1
2 1  2
1 2  3

>>> df2
    d
a    
1  11
2  12
3  13

我继续像这样合并这两个:

>>> df1.merge(df2, how='outer', left_index=True, right_index=True)

     c   d
a b       
1 1  1  11
2 1  2  12
1 2  3  11

虽然我希望在此连接中也应返回不匹配的索引,如下所示:

       c    d
a b       
1 1    1    11
2 1    2    12
3 NaN  NaN  13
1 2    4    11

【问题讨论】:

    标签: python pandas join merge


    【解决方案1】:

    你可以使用一个小技巧 - reset_index by level b, merge and last set_index by b:

    df2 = df1.reset_index(level='b')
             .merge(df2, how='outer', left_index=True, right_index=True)
             .set_index('b', append=True)
    print (df2)
             c   d
    a b           
    1 1.0  1.0  11
      2.0  3.0  11
    2 1.0  2.0  12
    3 NaN  NaN  13
    

    【讨论】:

    • 由于重叠,这似乎产生了后缀列?
    • 有趣,对我来说,在 python 3 中,pandas 0.19.2 可以完美运行。
    • 确实很有趣——它在Python 3 + Pandas 0.19.2 上也适用于我,但不适用于Python 2.7 + Pandas 0.19.2
    • 可能更糟糕的是支持 python 2.7 在 pandas :(
    • 抱歉,可能是PEBKAC,似乎也适用于2.7
    【解决方案2】:

    我认为这就是您要寻找的,因为这不仅仅是一个连接,而是一个 MultiIndex 连接。

    pd.merge(df1.reset_index(), df2.reset_index(),on='a', how='outer').set_index(['a','b'])
    
             c   d
    a b           
    1 1.0  1.0  11
      2.0  3.0  11
    2 1.0  2.0  12
    3 NaN  NaN  13
    

    它的输出相同,但在这种情况下索引是有序的。

    【讨论】:

    • 或多或少:先删除索引,然后合并? :-)
    • 差不多,最后再放回去
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2016-12-07
    • 2023-02-01
    • 2016-09-18
    相关资源
    最近更新 更多