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我完全同意你的编辑。对于任何感兴趣的人,这里有一个相关的问题: