Python / Numpy (CSV): поиск значений, добавление еще одного CSV - PullRequest
0 голосов
/ 14 ноября 2018

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

У меня есть файл Master CSV, и мне нужно найти определенную «строку» из третьего столбца.Ниже показано:

Name,ID,Title,Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
Joshua Morales,MF6B9X,Tech_Rep, 08-Nov-2016,948,740,8,8
Betty García,ERTW77,SME, 08-Nov-2016,965,854,15,12
Kathleen Marrero,KTD684,Probation, 08-Nov-2016,946,948,na,na
Mark León,GSL89D,Tech_Rep, 08-Nov-2016,951,844,6,4

Столбец идентификатора уникален, и поэтому я пытался найти 'KTD684' (для примера).После обнаружения мне нужно экспортировать значения «Дата», «Prj1_Assigned», «Prj1_closed», «Prj2_assigned» и «Prj2_solved».

Экспорт будет осуществляться в файл «KTD684.csv» (то же самое)в качестве идентификатора), где уже есть доступные заголовки 'Date, Prj1_Assigned, Prj1_closed, Prj2_assigned, Prj2_solved'

Пока (поскольку я не программист) я не смог составить это, но могу ли я, пожалуйста,будьте любезны со мной:

  1. Поиск строки с элементом 'KTD684'.
  2. Выбор значений ниже из этой строки: ['Date, Prj1_Assigned, Prj1_closed,Prj2_assigned, Prj2_solved ']
  3. Присоедините файл с самим именем ID, пожалуйста (' KTD684.csv ')

Мне нужно выполнить это для 45 идентификаторов пользователей, и теперь с наймом вкомпания, ее 195. Я пытался написать макрос Excel (тоже не работал), но я чувствую, что Python наиболее надежен.

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

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Вот чистый подход Python, который читает основной файл .csv с csv.DictReader, сопоставляет идентификаторы и добавляет данные файла в новый или существующий файл .csv с csv.DictWriter():

from csv import DictReader
from csv import DictWriter

from os.path import isfile

def export_csv(user_id, master_csv, fieldnames, key_id, extension=".csv"):
    filename = user_id + extension
    file_exists = isfile(filename)

    with open(file=master_csv) as in_file, open(
        file=filename, mode="a", newline=""
    ) as out_file:

        # Create reading and writing objects
        csv_reader = DictReader(in_file)
        csv_writer = DictWriter(out_file, fieldnames=fieldnames)

        # Only write header once
        if not file_exists:
            csv_writer.writeheader()

        # Go through lines and match ids
        for line in csv_reader:
            if line[key_id] == user_id:

                 # Modify line and append to file
                line = {k: v.strip() for k, v in line.items() if k in fieldnames}
                csv_writer.writerow(line)

Который можно назвать так:

export_csv(
    user_id="KTD684",
    master_csv="master.csv",
    fieldnames=["Date", "Prj1_Assigned", "Prj1_closed", "Prj2_assigned", "Prj2_solved"],
    key_id="ID",
)

И производит следующее KTD684.csv :

Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
08-Nov-2016,946,948,na,na
0 голосов
/ 14 ноября 2018

Если я правильно понимаю вашу проблему;Вам нужно прочитать из 2 входных файлов:

  • 1, содержащие идентификаторы пользователей, которые вы ищете

  • 2, содержащие данные проекта, относящиеся к пользователям

Таким образом, что-то подобное найдет всех пользователей, указанных вами в 1 в файле 2, и запишет их в result.csv

Септифицируйте ваш поискИдентификаторы в search_for.csv.Имейте в виду, что это будет пересматривать ваш файл result.csv при каждом его запуске.

import csv
import sys
import os


inputPatterns = open(os.curdir + '/search_for.csv', 'rt')

# Reader for the IDs (users) you are looking to find (key)
reader = csv.reader(inputPatterns)

ids = []

# reading the IDs you are looking for from search_for.csv
for row in reader:
    ids.append(row[0])
inputPatterns.close()

# Let's see if any of the user IDs we are looking for has any project related info
# if so write them to your output CSV
for userID in ids:
    # Organization list with names and Company ID and reader
    userList = open(os.curdir + '/users.csv', 'rt')
    reader = csv.reader(userList)

    # This will be the output file
    result_f = open(os.curdir + "/" + userID + ".csv", 'w')
    w = csv.writer(result_f)
    # Writing header information
    w.writerow(['Date', 'Prj1_Assigned', 'Prj1_closed', 'Prj2_assigned', 'Prj2_solved'])

    # Scanning for projects for user and appending them
    for row in reader:
        if userID == row[1]:
            w.writerow([row[3], row[4], row[5], row[6], row[7]])
    result_f.close()
    userList.close()

Например, search_for.csv выглядит следующим образом

if your search_for.csv looks like this

0 голосов
/ 14 ноября 2018

Это идеальный вариант использования для pandas:

import pandas as pd

id_list = ['KTD684']

df = pd.read_csv('input.csv')
# Only keep values that are in 'id_list'
df = df[df['ID'].isin(id_list)]

gb = df.groupby('ID')
for name, group in gb:
    with open('{}.csv'.format(name), 'a') as f:
        group.to_csv(f, header=False, index=False,
                     columns=["Date", "Prj1_Assigned", "Prj1_closed",
                             "Prj2_assigned", "Prj2_solved"])

Это откроет CSV, только выберите строки, которые есть в вашем списке (id_list),сгруппируйте по значениям в столбце ID и сохраните отдельные файлы CSV для каждого уникального ID.Вам просто нужно развернуть id_list, чтобы получить интересующие вас идентификаторы.


Расширенный пример:

Чтение в CSV приводит к объекту DataFrame, подобному этому:

df = pd.read_csv('input.csv')
               Name      ID      Title          Date  Prj1_Assigned  \
0    Joshua Morales  MF6B9X   Tech_Rep   08-Nov-2016            948
1      Betty García  ERTW77        SME   08-Nov-2016            965
2  Kathleen Marrero  KTD684  Probation   08-Nov-2016            946
3         Mark León  GSL89D   Tech_Rep   08-Nov-2016            951

   Prj1_closed Prj2_assigned Prj2_solved
0          740             8           8
1          854            15          12
2          948            na          na
3          844             6           4

Если вы просто выберите KTD684 и GSL89D:

id_list = ['KTD684', 'GSL89D']
df = df[df['ID'].isin(id_list)]
               Name      ID      Title          Date  Prj1_Assigned  \
2  Kathleen Marrero  KTD684  Probation   08-Nov-2016            946
3         Mark León  GSL89D   Tech_Rep   08-Nov-2016            951

   Prj1_closed Prj2_assigned Prj2_solved
2          948            na          na
3          844             6           4

Операции groupby группируются по ID и экспортируют каждый уникальный идентификатор в файл CSV, что приводит к:

KTD684.csv
Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
08-Nov-2016,946,948,na,na

GSL89D.csv
Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
08-Nov-2016,951,844,6,4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...