Python/Pandas - 按列值删除重复行

Posted

技术标签:

【中文标题】Python/Pandas - 按列值删除重复行【英文标题】:Python/Pandas - Delete duplicate rows by column value 【发布时间】:2018-04-10 03:33:47 【问题描述】:

我有这样的 DataFrame:

     sale_id          dt        receipts_qty 
31     196.0  2017-02-19                95.0    
32     203.0  2017-02-20               101.0   
33     196.0  2017-02-21               105.0            
34     196.0  2017-02-22               112.0           
35     196.0  2017-02-23               118.0           
36     196.0  2017-02-24               135.0            
37     196.0  2017-02-25               135.0           
38     196.0  2017-02-26               124.0           
40     203.0  2017-02-27               290.0          
39     196.0  2017-02-27                84.0          
42     203.0  2017-02-28               330.0            
41     196.0  2017-02-28               124.0           
43     196.0  2017-03-01               100.0          
44     203.0  2017-03-01               361.0         

我必须删除 dt 的重复项并保留 sale_id == 196 所在的行。我只找到了drop_duplicates('dt', keep='last')drop_duplicates('dt', keep='first'),但这不是我需要的。

我要获取的DataFrame:

     sale_id          dt        receipts_qty  
31     196.0  2017-02-19                95.0   
32     203.0  2017-02-20               101.0       
33     196.0  2017-02-21               105.0            
34     196.0  2017-02-22               112.0           
35     196.0  2017-02-23               118.0           
36     196.0  2017-02-24               135.0            
37     196.0  2017-02-25               135.0           
38     196.0  2017-02-26               124.0                 
39     196.0  2017-02-27                84.0                     
41     196.0  2017-02-28               124.0           
43     196.0  2017-03-01               100.0          

【问题讨论】:

【参考方案1】:

首先按条件为第一个值创建辅助列,然后是 sort_valuesdrop_duplicates

最后一次清理 - 删除列 asort_index

print (df)
    sale_id          dt  receipts_qty
31    196.0  2017-02-19          95.0
32    203.0  2017-02-20         101.0
33    196.0  2017-02-21         105.0
34    196.0  2017-02-22         112.0
35    196.0  2017-02-23         118.0
36    196.0  2017-02-24         135.0
37    196.0  2017-02-25         135.0
38    196.0  2017-02-26         124.0
40    203.0  2017-02-27         290.0
39    196.0  2017-02-27          84.0
42    103.0  2017-02-28         330.0 <-changed data, value < 196
41    196.0  2017-02-28         124.0
43    196.0  2017-03-01         100.0
44    203.0  2017-03-01         361.0

#get only values > 196 
df['a'] = (df.sale_id == 196).astype(int)
#sorting by new column, remove duplicates, remove helper column
df['a'] = (df.sale_id == 196).astype(int)
df = (df.sort_values(['a','dt'], ascending=[False, True])
       .drop_duplicates('dt')
       .drop('a', axis=1)
       .sort_index())
print (df)
    sale_id          dt  receipts_qty
31    196.0  2017-02-19          95.0
32    203.0  2017-02-20         101.0
33    196.0  2017-02-21         105.0
34    196.0  2017-02-22         112.0
35    196.0  2017-02-23         118.0
36    196.0  2017-02-24         135.0
37    196.0  2017-02-25         135.0
38    196.0  2017-02-26         124.0
39    196.0  2017-02-27          84.0
41    196.0  2017-02-28         124.0
43    196.0  2017-03-01         100.0

【讨论】:

以上是关于Python/Pandas - 按列值删除重复行的主要内容,如果未能解决你的问题,请参考以下文章

根据列值删除Python Pandas中的DataFrame行[重复]

按列值将数据框拆分为两个[重复]

Python pandas:选择列值为null / None / nan的行[重复]

二位数组按行按列遍历效率问题小细节

二位数组按行按列遍历效率问题小细节

二位数组按行按列遍历效率问题小细节