我是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
答案 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])
感谢。