如何在不使用熊猫的情况下基于python中的两列删除文件中的重复行?

时间:2019-03-30 07:22:10

标签: python duplicates

我目前有一个看起来像这样的文件:

Fruit         Shop         Price
Apple         Shop A       $2.00
Apple         Shop A       $3.50
Apple         Shop B       $1.50
Apple         Shop B       $2.70
Apple         Shop B       $2.75
Apple         Shop C       $2.10
Orange        Shop A       $4.00
Orange        Shop A       $4.50
Orange        Shop C       $1.00
Orange        Shop C       $5.00

但是要根据“水果”和“商店”列进行折叠,因此看起来更像这样:

Fruit         Shop         Price
Apple         Shop A       $2.00
Apple         Shop B       $2.70
Apple         Shop C       $2.10
Orange        Shop A       $4.00
Orange        Shop C       $1.00

仅保留最便宜的实例。然后,我想计算每个水果的商店数量,制作一张这样的桌子:

Apple         3
Orange        2

我已经用一个非常简单的pandas数据框做到了这一点,但我想知道在没有pandas的情况下用python编写这种方法是什么?我的文件非常大,在熊猫中执行此操作的速度非常慢,并且某些文件格式无法在熊猫中很好地工作。

我是堆栈溢出的新手,所以我希望我不要问一个坏问题...

谢谢。

1 个答案:

答案 0 :(得分:1)

看起来像itertools.groupby的任务,可以按照以下方式完成

import itertools
data = [['Apple', 'Shop A', 2.00], ['Apple', 'Shop A', 3.50], ['Apple', 'Shop B', 1.50], ['Apple', 'Shop B', 2.70], ['Apple', 'Shop B', 2.75], ['Apple', 'Shop C', 2.10], ['Orange', 'Shop A', 4.00], ['Orange', 'Shop A', 4.50], ['Orange', 'Shop C', 1.00], ['Orange', 'Shop C', 5.00]]
unique = []
for _,group in itertools.groupby(data,key=lambda x:x[0]+x[1]):
    unique.append(min(list(group),key=lambda y:y[-1]))
for i in unique:
    print(*i,sep='\t')

输出:

Apple   Shop A  2.0
Apple   Shop B  1.5
Apple   Shop C  2.1
Orange  Shop A  4.0
Orange  Shop C  1.0

为清楚起见,我对data进行了硬编码,请注意,它是list中的list,在每个子列表中,最后一个元素是float,而不是str。在itertools.groupby中,我将前两个元素作为key的使用,因此,例如,两个第一个记录得到了AppleShopA并归为一组。然后在每个组中,我将min函数与适当的key一起使用,以便找到价格最低的元素。

itertools是Python的“包含电池”,但是如果您对SQL查询感到满意,则可以通过从数据中创建SQL表,然后编写SQL查询来使用另一个“包含电池” sqlite3与GROUP BY。