【问题标题】:Pandas equivalent of a SQL not exists subquery相当于 SQL 的 Pandas 不存在子查询
【发布时间】:2019-04-05 05:51:37
【问题描述】:

我正在尝试从 Pandas 表中删除某些行。它本质上是一个重复数据删除练习:

我有一张桌子

           id          sub_id1       sub_id2              date       
0           1           424755           101        2018-09-21      
1           2           424755           101        2018-09-21
2           3           424755           102        2018-09-21
3           4           678321           101        2018-09-21
4           5           678321           102        2018-09-22
5           6           424755           102        2018-09-22

如果有另一行与sub_id1date 匹配,但具有较低的sub_id2,我想删除一行。

我为此编写的 SQL 是

select * from table t
where not exists (select 1 from table
                  where sub_id1=t.sub_id1
                  and date=t.date
                  and sub_id2<t.sub_id2)

结果表将是

           id          sub_id1       sub_id2              date       
0           1           424755           101        2018-09-21      
1           2           424755           101        2018-09-21
2           4           678321           101        2018-09-21
3           5           678321           102        2018-09-22
4           6           424755           102        2018-09-22

其中id=3 被删除,因为有些行的sub_id1 和日期列与它完全相同,但sub_id2 较低。

尝试使用 Pandas 合并来解决这个问题。谢谢!

【问题讨论】:

    标签: python sql pandas join merge


    【解决方案1】:

    这更像是groupby 问题+min 值切片(我在这里使用transform min

    s=df.groupby(['sub_id1','date']).sub_id2.transform('min')
    df[df.sub_id2==s]
    Out[146]: 
       id  sub_id1  sub_id2        date
    0   1   424755      101  2018-09-21
    1   2   424755      101  2018-09-21
    3   4   678321      101  2018-09-21
    4   5   678321      102  2018-09-22
    5   6   424755      102  2018-09-22
    

    where sub_id1=t.sub_id1 and date=t.date : df.groupby(['sub_id1','date'])

    sub_id2&lt;t.sub_id2 : df.sub_id2==s

    【讨论】:

      【解决方案2】:

      概述:此代码将对数据集进行分组并找到最小复合键值

      id=[1,2,3,4,5,6]
      sub_id1=[424775,424775,424775,678321,678321,424755]
      sub_id2=[101,101,102,101,102,102]
      date=['2018-09-21','2018-09-21','2018-09-21','2018-09-21','2018-09-21','2018-09-21']
      
      dict={
          'id':id,
          'sub_id1':sub_id1,
          'sub_id2':sub_id2,
          'date':date
      }
      
      df1=pd.DataFrame(dict,index=id)
      df1['date']=pd.to_datetime(df1['date'])
      df1.sort_values(['sub_id1','sub_id2'],inplace=True)
      #print(df1.info())
      #print(df1.keys)
      query=df1[df1['date']=='2018-09-21']
      #print(query)
      #print(df1)
      print(df1.groupby(['sub_id1','date'])['sub_id2'].min())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 1970-01-01
        相关资源
        最近更新 更多