#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, но это домашнее задание, и в инструкциях сказано, что нам не разрешено. Тем не менее, спасибо!