Python - 按多列分组并获取最大值或总和

时间:2015-08-27 01:16:24

标签: python group-by

我有兴趣获得产品价格的最大值。

以下是输入数据。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"]

1 个答案:

答案 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并打印每个,如果这是您真正想要的。