Python Pandas grouby

时间:2018-05-20 15:51:22

标签: python python-2.7 csv

我是python的新手,我在从CSV文件中分组列时遇到问题。我想找到每个类别的总价。

CSV:

category,item,quantity,individual_price

shirts,Blue Shirt,3,25.75

shirts,Red Shirt,1,32.09

pants,Jeans,4,87.00

pants,Slacks,2,92.99

这是我到目前为止所拥有的:

import csv
import operator

with open('shopping_cart.csv', 'r') as f:

    sample = open('shopping_cart.csv','r')

    sample.next()

    csv1 = csv.reader(sample, delimiter=',')

    sort = sorted(csv1, key=operator.itemgetter(3))

for eachline in sort:

    print eachline[3]

输出:

25.75

32.09

87.00

92.99

3 个答案:

答案 0 :(得分:1)

我认为这可以胜任。

import csv
from collections import defaultdict


d = defaultdict(float)

with open('data.csv') as f:
    reader = csv.DictReader(f)
    for line in reader:
        d[line['category']] += float(line['individual_price'])

for category, total_price in d.items():
    print('{}: {}'.format(category, total_price))

输出

shirts: 57.84
pants: 179.99

它使用csv.DictReader,因此我们不必跳过标题和defaultdict,它允许我们在分配之前不要初始化字典中的每个键。在这种情况下它非常有用。

答案 1 :(得分:0)

我认为值得回答的是如何在Pandas中完成这项工作,因为包括导入声明在内的是3行。

import pandas as pd

#read in the CSV and reset the index
df = pd.DataFrame.from_csv('shopping_cart.csv').reset_index()

print(df.groupby('category').agg({'individual_price': sum}))

输出

          individual_price
category
pants               179.99
shirts               57.84

如果您想迭代价格并在该循环中执行某些操作:

catagg = df.groupby('category').agg({'individual_price': sum})
for idx, col in catagg.iterrows():
    print(col.name , col.get_value('individual_price'))

输出

pants 179.99
shirts 57.84

答案 2 :(得分:0)

您还可以使用以下代码执行相同的工作( data.py )。

在这种情况下,我刚刚读取了CSV文件 data.csv 并从第二行开始处理(因为第一行表示数据字段的名称)。

<强> data.csv

category,item,quantity,individual_price
shirts,Blue Shirt,3,25.75
shirts,Red Shirt,1,32.09
pants,Jeans,4,87.00
pants,Slacks,2,92.99

<强> data.py

data = {}  # mapping data structure: category => total price of all products of that category

with open("data.csv") as csv: 
    for line in csv.readlines()[1:]:
        data_list = line.strip().split(",")

        if data_list[0] not in data:
            data[data_list[0]] = float(data_list[3])
        else:
            data[data_list[0]] = data[data_list[0]] + float(data_list[3])

print(data)

for category in data:
    print(category, " : ", data[category])

感谢。