Корреляция данных из двух CSV и запись данных в первый CSV с использованием Python - PullRequest
0 голосов
/ 20 февраля 2019

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

Это работает отлично, за исключением одной маленькой ошибки.Первая новая записанная строка не начинается с отдельной строки: введите описание изображения здесь

1 Ответ

0 голосов
/ 20 февраля 2019

Составьте словарь, отображающий блюда для угощений

treats = {}
with open(treatfile) as f2:
    for line in f2:
        meal,treat = line.strip().split(',')
        treats[meal] = treat

Переберите файл еды и создайте множество новых записей.Используйте namedtuples для новых элементов.

import collections
new_items = set()
Treat = collections.namedtuple('Treat', ['blank_column','Kennel_Number','Species','Food','Meal_ID'])

with open(mealfile) 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(mealfile, 'a') as f1:
    writer = csv.DictWriter(f1, fieldnames)
    for row in new_items:
        writer.writerow(row._asdict())

Если файл еды не заканчивается насимвол новой строки, вам нужно будет добавить его перед написанием новых treat строк.Поскольку у вас есть контроль над файлами, вы должны просто убедиться, что они всегда заканчиваются пустой строкой.

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