Python 熊猫的数据帧代数

Python 熊猫的数据帧代数,python,pandas,Python,Pandas,假设我有两个数据帧 df1 df2 我可以在df1_键和df2_键上加入 我想: (A-B) (A-B)U(B-A) 使用A=df1和B=df2 从我在上读到的内容来看,pd.merge的how参数支持以下选项: how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’ left: use only keys from left frame (SQL: left outer join) right: u

假设我有两个数据帧

df1
df2
我可以在
df1_键
df2_键
上加入

我想:

  • (A-B)
  • (A-B)U(B-A)
  • 使用
    A=df1
    B=df2

    从我在上读到的内容来看,
    pd.merge
    how
    参数支持以下选项:

    how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
            left: use only keys from left frame (SQL: left outer join)
            right: use only keys from right frame (SQL: right outer join)
            outer: use union of keys from both frames (SQL: full outer join)
            inner: use intersection of keys from both frames (SQL: inner join)
    
    但它们都没有直接给出上面的集合运算1和2

    以下是SQL的相应参考(来源),仅供参考:


    虽然不直接支持这些功能,但可以通过在尝试连接之前调整索引来实现这些功能

    您可以使用
    -
    运算符设置减号:

    In [11]: ind = pd.Index([1, 2, 3])
    
    In [12]: ind2 = pd.Index([3, 4, 5])
    
    In [13]: ind - ind2
    Out[13]: Int64Index([1, 2], dtype='int64')
    
    并设置与
    |
    的并集和与
    &
    的交集:

    In [14]: ind | ind2
    Out[14]: Int64Index([1, 2, 3, 4, 5], dtype='int64')
    
    In [15]: ind & ind2
    Out[15]: Int64Index([3], dtype='int64')
    
    因此,如果您有一些具有这些索引的数据帧,则可以在加入之前重新编制索引:

    In [21]: df = pd.DataFrame(np.random.randn(3), ind, ['a'])  # ind = df.index
    
    In [22]: df2 = pd.DataFrame(np.random.randn(3), ind2, ['b'])  # ind2 = df2.index
    
    In [23]: df.reindex(ind & ind2)
    Out[23]:
              a
    3  1.368518
    
    因此,现在您可以建立您想要的任何连接:

    In [24]: df.reindex(ind & ind2).join(df2.reindex(ind & ind2))  # equivalent to inner
    Out[24]:
              a         b
    3  1.368518 -1.335534
    
    In [25]: df.reindex(ind - ind2).join(df2.reindex(ind - ind2))  # join on A set minus B
    Out[25]:
              a   b
    1  1.193652 NaN
    2  0.064467 NaN
    

    您如何将此扩展到对列而不是索引执行代数?(即,我的意思是对特定列进行设置差分,如OP中的图表所示)。我想我可以在加入之前简单地做
    df.set_index(columns_for_the_join)
    ,但是列中的一些条目是
    NaN
    ,当我将此列转换为索引时,它失败了,因为如果
    ind_diff=ind-ind2
    (因此
    ind_diff
    ),我以后就不能用
    ind-ind-ind2
    索引我的数据帧了具有NaN值。@Josh列也是一个
    索引
    ,因此您可以对
    df.columns
    执行相同的设置操作。我不知道你在问什么,你应该可以加入NaNs的索引。。。也许你可以问这个新问题?谢谢@Andy我非常感谢你的帮助。我用一个例子更新了OP,以澄清我的意思。@Josh我认为这应该是一个新问题。原来的问题很好,你不应该改变它!我已经将其回滚到上一个版本,我认为这是一个很好的问题。请分别询问具体方面,乐意回答!:)谢谢@AndyHayden我完全同意你的编辑。对于任何感兴趣的人,这里有一个相关的问题: