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

pad*_*ddu 4 python group-by

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

这是输入数据。下载销售数据

我想按州、国家/地区分组

我如何对这两列进行分组以获得价格的最大值。

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"])    
Run Code Online (Sandbox Code Playgroud)

与熊猫的使用。我可以在不使用 pandas 的情况下得到这个吗?

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"]
Run Code Online (Sandbox Code Playgroud)

Ana*_*mar 8

itertools.groupby仅适用于使用与 groupby 相同的键函数排序的列表,如文档中给出的-

itertools.groupby(iterable[, key])

创建一个迭代器,从可迭代对象中返回连续的键和组。键是计算每个元素的键值的函数。如果未指定或为 None,则 key 默认为恒等函数并返回未更改的元素。一般来说,可迭代对象需要已经在相同的键函数上进行排序。

因此,为了实现您想要的效果itertools.groupby,您很可能需要首先根据'Country'和 来对数据进行排序'State' ,然后对其进行 groupby 。

另外,服用时不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]
Run Code Online (Sandbox Code Playgroud)

我将键添加到结果中,以识别哪个Country/State每个最大值对应。result之后,如果您真正想要的话,您可以迭代并打印每个内容。