Как заполнить нулевые значения в столбце в CSV-файле? - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно прочитать CSV-файл и заполнить пустые / пустые значения в столбце «Телефон и электронная почта» на основе адреса этого человека и записать в новый CSV-файл. Например: если у человека "Джонас Канвальд" нет номера телефона или адреса электронной почты , но тот же адрес, что и у человека выше или ниже, произнесите "Ханна Канвальд", тогда мы должны заполнить пустые / нулевые значения данными этого человека.

Я не смогу использовать python pandas, так как остальная часть кода / программ основана исключительно на python 2.7 (к сожалению), поэтому мне просто нужно написать функцию или logi c для захвата только этой информации.

Формат ввода / таблица выглядит следующим образом с пустыми ячейками (CSV-файл):

FirstName,LastName,Phone,Email,Address
Hannah,Kahnwald,1457871452,hannkahn@gmail.com,145han street
Micheal,Kahnwald,6231897383,,145han street
Jonas,Kahnwald,,,145han street
Mikkel,Nielsen,4509213887,mikneil@yahoo.com,887neil ave
Magnus,Nielsen,,magnusneil@kyle.co,887neil ave
Ulrich,Nielsen,,,887neil ave
katharina,Nielsen,,,887neil ave
Elisabeth,Doppler,5439001211,elsisop@amaz.com,211elis park
Peter,Doppler,,,211elis park
bartosz,Tiedmannn,6263172828,tiedman@skype.com,828alex street
Alexander,washington,,,321notsame street
claudia,Tiedamann,,,828alex street

Формат вывода должен быть таким, как показано ниже:

Hannah,Kahnwald,1457871452,hannkahn@gmail.com,145han street
Micheal,Kahnwald,6231897383,hannkahn@gmail.com,145han street
Jonas,Kahnwald,1457871452,hannkahn@gmail.com,145han street
Mikkel,Nielsen,4509213887,mikneil@yahoo.com,887neil ave
Magnus,Nielsen,4509213887,magnusneil@kyle.co,887neil ave
Ulrich,Nielsen,4509213887,mikneil@yahoo.com,887neil ave
katharina,Nielsen,4509213887,mikneil@yahoo.com,887neil ave
Elisabeth,Doppler,5439001211,elsisop@amaz.com,211elis park
Peter,Doppler,5439001212,elsisop@amaz.com,211elis park
bartosz,Tiedmannn,6263172828,tiedman@skype.com,828alex street
Alexander,washington,,,321notsame street
claudia,Tiedamann,6263172828,tiedman@skype.com,828alex street
import csv,os

def get_info(file path):
    data = []
    with open(file, 'rb') as fin:
        csv_reader =  csv.reader(fin)
        next(reader)
        for each in csv_reader:

            FirstName = each[0]
            LN = each[1]
            Phone =  "some function or logic"
            email = " some function or logic"
            Address = each[4]
            login = ""
            logout = ""

            data.append([FirstName,LN,Phone,email,Address,login,logout])

   f.close()
   return data

1 Ответ

0 голосов
/ 17 апреля 2020

Это значительно обновленная версия, которая пытается заполнить отсутствующие данные из других записей в файле, но только если они имеют одинаковое поле Address. Чтобы ускорить поиск, он создает словарь для внутреннего использования, который называется attr_dict и содержит все записи с определенным адресом. Он также использует namedtuple s внутри, чтобы сделать код немного более читабельным.

Обратите внимание, что при извлечении недостающей информации он будет использовать данные из первой записи, найденной в этом хранилище. внутренний словарь на Address. Кроме того, я не думаю, что предоставленные вами образцы данных содержат все возможные случаи, поэтому потребуется провести дополнительное тестирование.

import csv
from collections import namedtuple


def get_info(file_path):

    # Read data from file and convert to list of namedtuples, also create address
    # dictionary to use to fill in missing information from others at same address.
    with open(file_path, 'rb') as fin:
        csv_reader =  csv.reader(fin, skipinitialspace=True)

        header = next(csv_reader)
        Record = namedtuple('Record', header)

        newheader = header + ['Login', 'Logout'] # Add names of new columns.
        NewRecord = namedtuple('NewRecord', newheader)

        addr_dict = {}
        data = [newheader]

        for rec in (Record._make(row) for row in csv_reader):
            if rec.Email or rec.Phone:  # Worth saving?
                addr_dict.setdefault(rec.Address, []).append(rec)  # Remember it.

            login, logout = "",  ""  # Values for new columns.
            data.append(NewRecord._make(rec + (login, logout)))

    # Try to fill in missing data from any other records with same Address.
    for i, row in enumerate(data[1:], 1):
        if not (row.Phone and row.Email):  # Info missing?
            # Try to copy it from others at same address.
            updated = False
            for other in addr_dict.get(row.Address, []):
                if not row.Phone and other.Phone:
                    row = row._replace(Phone=other.Phone)
                    updated = True
                if not row.Email and other.Email:
                    row = row._replace(Email=other.Email)
                    updated = True
                if row.Phone and row.Email:  # Info now filled in?
                    break

            if updated:
                data[i] = row

    return data


INPUT_FILE = 'null_cols.csv'
OUTPUT_FILE = 'fill_cols.csv'

data = get_info(INPUT_FILE)

with open(OUTPUT_FILE, 'wb') as fout:
    writer = csv.DictWriter(fout, data[0])  # First elem has column names.
    writer.writeheader()
    for row in data[1:]:
        writer.writerow(row._asdict())

print('Done')

Снимок экрана результатов в Excel:

Screenshot of results

...