相当于SQL不存在的熊猫子查询

时间:2018-11-01 01:08:55

标签: python sql pandas join merge

我正在尝试从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和date列完全相同的行,而其行sub_id2较低。

试图通过Pandas合并来解决这个问题。谢谢!

2 个答案:

答案 0 :(得分: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.datedf.groupby(['sub_id1','date'])

sub_id2<t.sub_id2df.sub_id2==s

答案 1 :(得分:0)

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

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())