我在超市中有一个包含销售信息的数据框。数据框中的每一行代表一个项目,具有多个特征作为列。原始的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
我想过滤掉属于同一故障单的重复项目。例如,在第一张票(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
我的猜测是groupby
TICKET_NUMBER,然后按unique()
,(df.groupby(['TICKET_NUMBER','TICKET_ROW'])['ITEM'].unique()
)过滤ITEM。一旦我获得了唯一的值,我想将这些组(类型为“ungroupby”)反转为DataFrame。这可能吗?
我确信还有其他方法可以做我正在寻找的东西。请帮助!
谢谢!
答案 0 :(得分:5)
我觉得你很亲密。看起来在重复的情况下使用第一个TICKET_ROW就足够了,我们可以使用as_index=False
来保持看起来像原始数据帧。所以我们可以通过TICKET_NUMBER和ITEM进行分组并获取第一个TICKET_ROW:
df.groupby(["TICKET_NUMBER", "ITEM"], sort=False, as_index=False)["TICKET_ROW"].first()
给出了
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