【问题标题】:Pandas performing a SQL subtraction between two dataframesPandas 在两个数据帧之间执行 SQL 减法
【发布时间】:2013-11-18 22:56:16
【问题描述】:

我有两个数据框。首先是DF1:

ID      Other value
1           a
2           b
3           c

然后是DF2,它是DF1的子集:

ID      Other value
1           a

我想创建第三个数据框,它相当于 SQL 中的减号:删除两个数据框交集处的所有观察结果。这会让我留下 DF3:

ID      Other value
2           b
3           c

我一直在尝试使用pandasql,但它似乎不喜欢我的sql。代码如下: 从 pandasql 导入 * 将熊猫导入为 pd

pysqldf = lambda q: sqldf(q, globals())
train = pysqldf(""" SELECT * FROM DF1 WHERE ID 
                           NOT IN (SELECT ID FROM DF2) """)

我得到了错误

Error on sql  SELECT * FROM DF1 WHERE ID 
                           NOT IN (SELECT ID FROM DF2) 

关于出了什么问题或我如何使用其他一些熊猫功能快速实现这一点的任何想法。我可以毫无问题地在 R 中做完全相同的事情。

【问题讨论】:

    标签: python sql pandas


    【解决方案1】:

    应该这样做

    df1[df1.ID.isin(df2.ID) == False]
    

    【讨论】:

    • 我认为他的IDs 是一个索引。此外,(至少在 .13 中)您不需要 df2 上的 tolist()
    • 完美运行。非常感谢!我不需要 tolist()。
    【解决方案2】:

    您可以减去索引(设置为负):

    In [11]: df1
    Out[11]: 
       Other value
    ID            
    1            a
    2            b
    3            c
    
    In [12]: df2
    Out[12]: 
       Other value
    ID            
    1            a
    
    In [13]: df1.index - df2.index
    Out[13]: Int64Index([2, 3], dtype=int64)
    
    In [14]: df1.loc[df1.index - df2.index]  # assuming IDs are unique
    Out[14]: 
       Other value
    ID            
    2            b
    3            c
    

    0.13 中的另一个可用选项是使用 isin 方法:

    In [21]: df1.isin(df2)
    Out[21]: 
       Other value
    ID            
    1         True
    2        False
    3        False
    
    In [22]: df1[~df1.isin(df2).all(1)]
    Out[22]: 
       Other value
    ID            
    2            b
    3            c
    

    【讨论】:

    • 如果我发布了我的答案,那将是 30 秒内的 3 个答案:)。我浪费时间查看是否在索引上实现了 symmetric_difference(实际上没有)。
    • 我会打开一个问题。 df1.index.intersection(df2.index).union(df2.index.intersection(df1.index)) 应该是唯一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2017-01-03
    相关资源
    最近更新 更多