我目前有一个看起来像这样的文件:
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编写这种方法是什么?我的文件非常大,在熊猫中执行此操作的速度非常慢,并且某些文件格式无法在熊猫中很好地工作。
我是堆栈溢出的新手,所以我希望我不要问一个坏问题...
谢谢。
答案 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。