Питон Панды Гроуби - PullRequest
0 голосов
/ 20 мая 2018

Я новичок в 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 голосов
/ 20 мая 2018

Я думаю, что стоит ответить на этот вопрос о том, как это будет сделано в Пандах, так как это 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
0 голосов
/ 20 мая 2018

Вы также можете выполнить ту же работу с помощью следующего кода ( 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

данные.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])

Спасибо.

0 голосов
/ 20 мая 2018

Я думаю, что это сработает.

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, что позволяет нам не инициализировать каждый ключ в словаре перед его назначением.Это очень полезно в этом контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...