我有兴趣获得产品价格的最大值。
以下是输入数据。Download Sales Data
我想按国家/地区分组
如何对这两列进行分组得到Price的最大值。
import csv
import locale
from itertools import groupby
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
total_price = 0
max_price = 0
reader = csv.DictReader(open('/Users/myuser/Downloads/SalesData.csv', 'rU'), dialect='excel')
groups = groupby(reader, lambda d: d['State'])
result = [max(g, key=lambda d: d['State']) for k, g in groups]
for row in reader:
print row["State"], row["Country"], locale.atoi(row["Price"])
max_price = max(row.iteritems(), key=operator.itemgetter(1))
total_price += locale.atoi(row["Price"])
使用熊猫的。我可以在不使用熊猫的情况下得到这个。
import pandas as pd
from pandas import DataFrame
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
df = pd.read_csv('/Users/myuser/Downloads/SalesData.csv', index_col=False, header=0,thousands=',')
print df.groupby(["Country","State"]).max()["Price"]
答案 0 :(得分:4)
itertools.groupby
仅适用于使用与groupby相同的关键函数排序的列表,如documentation中所示 -
itertools.groupby(iterable [,key])
创建一个迭代器,从迭代中返回连续的键和组。关键是计算每个元素的键值的函数。如果未指定或为None,则键默认为标识函数并返回元素不变。 通常,迭代需要已经在相同的键函数上排序。
为了通过itertools.groupby
实现您想要的效果,您很可能需要先根据'Country'
和'State'
对数据进行排序,然后对其进行分组。
另外,在使用max()
时,您应使用'Price'
而不是'State'
。示例 -
reader = csv.DictReader(open('/Users/myuser/Downloads/SalesData.csv', 'rU'), dialect='excel')
sortedreader = sorted(reader, key=lambda d: (d['Country'], d['State']))
groups = groupby(sortedreader, key=lambda d: (d['Country'], d['State']))
result = [(k, max(g, key=lambda d: d['Price'])) for k, g in groups]
我在结果中添加了关键字,以确定每个最大值对应的Country
/ State
。在此之后,您可以迭代result
并打印每个,如果这是您真正想要的。