найти сумму для одного элемента в Python

#python #python-3.x

#python #python-3.x

Вопрос:

Существует csv с 9 столбцами и 1,5 миллионами строк. Вопрос просит нас вычислить расходы для каждой учетной записи. Существует 7700 номеров учетных записей, которые я смог извлечь. Вот пример из файла, поскольку кто-то попросил (это ссылка, поскольку у меня, по-видимому, недостаточно влияния здесь, чтобы публиковать фотографии):

пример файла

Я особенно смущен, учитывая, что вам нужно добавить дополнительный шаг умножения количества и цены, поскольку транзакции в таблице относятся к отдельным элементам.

О, и нам не разрешено использовать pandas . И все это является string данными.

Я не особо пробовал, потому что я в тупике, кроме простого получения списка всех идентификаторов учетной записи. Даже это было проблемой для меня, поэтому я ценю любую помощь. Ниже приведен просто код, который я использовал для получения списка идентификаторов, и я почти уверен, что я даже не должен был использовать import csv для этого, но ладно.

 import csv

f_file = open ('myfile.csv')
csv_f_file = csv.reader(f_file)

account_id = []
for row in csv_f_file:
    account_id.append(row[4])

account_id = set(account_id)
account_id_list = list(account_id)

print(customer_id_list)
  

Результат должен выглядеть примерно так (но представьте это 7000 раз):

 account:  SID600   
spending: 87.500
  

Спасибо всем, кто может помочь!!

Комментарии:

1. как выглядят данные в очень большом файле, можете ли вы поделиться небольшой их частью

2. @Sam, использует ли ваш csv заголовок?

3. @anfreihongrari да, это так

Ответ №1:

Вы могли бы сделать это доступным для чтения с помощью DictReader и DictWriter , но обязательно, чтобы у вас был CSV с заголовком. Также вы могли бы сохранить результаты в другом формате CSV для сохранения.

Поскольку в ваших входных данных может быть разный продукт для каждой записи для одной и той же учетной записи (например, для SID600 могут быть записи для chair , table и некоторые другие table с разными ценами и количествами), необходимо собрать все расходы в списках для каждой учетной записи, а затем суммировать их до общей суммы.

Пример ввода в формате CSV:

 date,trans,item,account,quantity,price
0409,h65009,chair,SID600,12.5,7
0409,h65009,table,SID600,40,2
0409,h65009,table,SID600,22,10
0409,h65009,chair,SID601,30,11
0409,h65009,table,SID601,30,11
0409,h65009,table,SID602,4,9
  

Код:

 import csv
from collections import defaultdict

inpf = open("accounts.csv", "r")
outpf = open("accounts_spending.csv", "w")

incsv = csv.DictReader(inpf)
outcsv = csv.DictWriter(outpf, fieldnames=['account', 'spending'])

outcsv.writeheader()

spending = defaultdict(list)

# calculate spendings for all entries
for row in incsv:
    spending[row["account"]].append(float(row["quantity"]) * float(row["price"]))

# sum the spendings for all accounts
for account in spending:
    spending[account] = sum(spending[account])

# output the spending to a CSV
for account, total_spending in spending.items():
    outcsv.writerow({
        "account": account,
        "spending": total_spending
    })

inpf.close()
outpf.close()
  

для вывода которого будет:

 account,spending
SID600,387.5
SID601,660.0
SID602,36.0
  

Комментарии:

1. Я думаю, что в его csv файле всего 2 столбца с 6 строками.

2. @Yusufsn что заставляет тебя так думать?

3. Прочитайте его первое предложение. «Существует csv с 6 строками: …»

4. @Yusufsn csv with 6 rows: date, transaction #, item, account, quantity, and price , очевидно, ошибка, он имел в виду столбцы.

5. Его пример содержит 6 строк. Но я не уверен. Возможно, я ошибаюсь

Ответ №2:

Вы можете попробовать это:

 import csv


with open ('myfile.csv') as f:
    csv_f_file = csv.reader(f)
    data = list(csv_f_file)
    res = {}
    for row in data:
        res[row[3]] = res.get(row[3], 0.0)
        res[row[3]]  = float(row[4]) * float(row[5])
    print(res)
  

Комментарии:

1. Это не сработало, это дало мне 0.0 для первого идентификатора. первые строки вывода выглядят следующим образом: {‘CSYSTEMID’: 0.0, ‘C0044101043442’: 0.0, ‘C0044101011944’: 0.0, ‘C0044101046706’: 0.0, ‘C0044101004484’: 1.3, ‘C0044101047453’: 0.0}. В инструкциях сказано, что первое значение должно быть равно 84000000. Хотя это было полезно, спасибо!!

2. Можете ли вы попробовать сейчас? Я допустил глупую ошибку, обновил ответ

3. теперь это дает мне большие значения, но все еще не те, которые предположительно являются правильными. вот результат: {‘CSYSTEMID’: 137661.44900002424, ‘C0044101043442’: 97.71000000000001, ‘C0044101011944’: 13.588999999999997, ‘C0044101046706’: 1.79, ‘C0044101004484’: 55.789999999998}. Этот вопрос — настоящая боль, я прошу прощения.

4. Если вы можете поделиться некоторыми примерами данных для этого, я могу это проверить.

5. хорошо, я только что добавил скриншот из файла, который нам дали, к моему вопросу

Ответ №3:

 import csv

f_file = open ('myfile.csv')
csv_f_file = csv.reader(p_supermarket_file)

account_id = []
for row in csv_f_file:
    account_id.append(row[4])

account_id = set(account_id)
account_id_list = list(account_id)
for id in account_id_list:
    for row in csv_f_file:
        if row[3] == id:
            total_amount = row[4] * row[5]
#make a dictionary to store amount and its corresponding is in it.
  

Я не тестировал это, но это я из того, что я понял.

Ответ №4:

Попробуйте Pandas. Используйте метод groupby с lamda. Если в вашем CSV-файле есть функции по строкам, выполните транспонирование, а затем используйте метод groupby.

Обращайтесь только к официальным сайтам документации pandas.

Комментарии:

1. Я бы сделал pandas, но это домашнее задание, и в инструкциях сказано, что нам не разрешено. Тем не менее, спасибо!