У меня возникают проблемы с поиском места, где можно погрузиться в этот личный проект, и я надеялся, что это сообщество поможет мне создать сценарий Python для работы с этими данными.
У меня есть файл CSV, который содержит список кормов для собак при спасении животных, связанный с номером питомника:
Источник CSV - foodsandtreats.csv
blank_column,Kennel_Number,Species,Food,Meal_ID
,1,Dog,Meal,11.2
,5,Dog,Meal,45.2
,3,Dog,Meal,21.4
,4,Dog,Meal,17
,2,Dog,Meal,11.2
,4,Dog,Meal,21.4
,6,Dog,Meal,17
,2,Dog,Meal,45.2
У меня есть второй CSV-файл, который содержит ключ, который сопоставляет блюда с тем, что угощение приходит с едой:
Ключ еды к лечению - MealsToTreatsKey.csv
Meals_fed,Treats_fed
10.1,2.4
11.2,2.4
13.5,3
15.6,3.2
17,3.2
20.1,5.1
21.4,5.2
35.7,7.7
45.2,7.9
Мне нужновзять каждый тип еды (например, отбросить повторяющиеся записи), который был доставлен из таблицы 1, найти связанный тип лакомства, а затем создать отдельную запись для каждого раза, когда лакомство подается в конкретный питомник.Конечный результат должен выглядеть примерно так:
Результат CSV - foodsandtreats.csv
blank_column,Kennel_Number,Species,Food,Meal_ID
,1,Dog,Meal,11.2
,5,Dog,Meal,45.2
,3,Dog,Meal,21.4
,4,Dog,Meal,17
,2,Dog,Meal,11.2
,4,Dog,Meal,21.4
,6,Dog,Meal,17
,2,Dog,Meal,45.2
,1,Dog,Treat,2.4
,5,Dog,Treat,7.9
,3,Dog,Treat,5.2
,4,Dog,Treat,3.2
,1,Dog,Treat,2.4
,4,Dog,Treat,5.2
Предпочел бы делать это с модулем CSV, а не с Pandas, но я открыт для использованияПанды при необходимости.
У меня пока есть немного кода, просто открывающего CSV, но я действительно застрял в том, куда идти дальше:
import csv
with open('./meals/results/foodToTreats.csv', 'r') as t1,
open('./results/food.csv', 'r') as t2:
key = t1.readlines()
map = t2.readlines()
with open('./results/food.csv', 'w') as outFileF:
for line in map:
if line not in key:
outFileF.write(line)
with open('./results/foodandtreats.csv', 'w') as outFileFT:
for line in map:
if line not in key:
outFileFT.write(line)
Так что в основном мне просто нужно взять каждую запись леченияна 2-м листе найдите соответствующие записи о продуктах питания на 1-м листе, найдите номер питомника, связанный с этой записью, и запишите его на 1-й лист.
Мой лучший снимок в псевдокоде, что-то вроде:
for x in column 0,y:
y,1 = Z
food = x
treat = y
kennel_number = z
when x,z:
writerows('', {'kennel_number"}, 'species', '{food/treat}',
{'meal_id"})
Обновление: вот точный код, который я использую, благодаря @wwii.Видя незначительную ошибку:
import csv
import collections
treats = {}
with open('mealsToTreatsKey.csv') as f2:
for line in f2:
meal,treat = line.strip().split(',')
treats[meal] = treat
new_items = set()
Treat = collections.namedtuple('Treat', ['blank_column','Kennel_Number','Species','Food','Meal_ID'])
with open('foodandtreats.csv') as f1:
reader = csv.DictReader(f1)
for row in reader:
row['Food'] = 'Treat'
row['Meal_ID'] = treats[row['Meal_ID']]
new_items.add(Treat(**row))
fieldnames = reader.fieldnames
with open('foodandtreats.csv', 'a') as f1:
writer = csv.DictWriter(f1, fieldnames)
for row in new_items:
writer.writerow(row._asdict())
Это работает отлично, за исключением одной маленькой ошибки.Первая новая записанная строка не начинается с отдельной строки: введите описание изображения здесь