熊猫:过滤组中的唯一值

And*_*res 6 python pandas

我在超市里有一个包含销售信息的数据框.数据框中的每一行代表一个项目,具有多个特征作为列.原始的DataFrame是这样的:

In [1]: import pandas as pd
        my_data = [{'ticket_number' : '001', 'ITEM' : 'vegetable', 'ticket_line' : '1'},
               {'TICKET_NUMBER' : '001', 'ITEM' : 'vegetable', 'TICKET_ROW' : '2'},
               {'TICKET_NUMBER' : '001', 'ITEM' : 'soup', 'TICKET_ROW' : '3'},
               {'TICKET_NUMBER' : '002', 'ITEM' : 'soup', 'TICKET_ROW' : '1'},
               {'TICKET_NUMBER' : '002', 'ITEM' : 'drink', 'TICKET_ROW' : '2'},
               {'TICKET_NUMBER' : '003', 'ITEM' : 'meat', 'TICKET_ROW' : '1'},
               {'TICKET_NUMBER' : '003', 'ITEM' : 'vegetable', 'TICKET_ROW' : '2'},
               {'TICKET_NUMBER' : '003', 'ITEM' : 'meat', 'TICKET_ROW' : '3'}]
        df = pd.DataFrame(my_data)

In [2]: df
Out [2]:    
            TICKET_NUMBER   TICKET_ROW        ITEM
         0        001            1           vegetable
         1        001            2           vegetable
         2        001            3           soup
         3        002            1           soup
         4        002            2           drink
         5        003            1           meat
         6        003            2           vegetable
         7        003            3           meat
Run Code Online (Sandbox Code Playgroud)

我想过滤掉属于同一票证的重复项目.例如,在第一张票(TICKET_NUMBER == 001)中,有2种蔬菜,所以我想删除其中的一种.票号003与肉类相同.

所以,最终的数据集看起来像这样:

        TICKET_NUMBER   TICKET_ROW        ITEM
     0        001            1           vegetable
     1        001            3           soup
     2        002            1           soup
     3        002            2           drink
     4        003            1           meat
     5        003            2           vegetable
Run Code Online (Sandbox Code Playgroud)

我的猜测是groupbyTICKET_NUMBER,然后过滤ITEM unique(),(df.groupby(['TICKET_NUMBER','TICKET_ROW'])['ITEM'].unique()).一旦我获得了唯一的值,我想将这些组(类型为"ungroupby")反转为DataFrame.那可能吗?

我确信还有其他方法可以做我正在寻找的东西.请帮忙!

谢谢!

DSM*_*DSM 6

我觉得你很亲密.看起来在重复的情况下使用第一个TICKET_ROW就足够了,我们可以as_index=False用来保持看起来像原始数据帧的东西.所以我们可以按TICKET_NUMBER和ITEM进行分组并获取第一个TICKET_ROW:

df.groupby(["TICKET_NUMBER", "ITEM"], sort=False, as_index=False)["TICKET_ROW"].first()
Run Code Online (Sandbox Code Playgroud)

这使

In [46]: df.groupby(["TICKET_NUMBER", "ITEM"], sort=False, as_index=False)["TICKET_ROW"].first()
Out[46]: 
  TICKET_NUMBER       ITEM TICKET_ROW
0           001  vegetable          1
1           001       soup          3
2           002       soup          1
3           002      drink          2
4           003       meat          1
5           003  vegetable          2
Run Code Online (Sandbox Code Playgroud)