Очистка документа Excel - форматирование ячеек на основе его содержимого - PullRequest
0 голосов
/ 11 октября 2019

Совершенно новый в Python, и я делаю мой первый проект - очистка данных Excel. Идея состоит в том, чтобы проверить данные перед загрузкой их в систему. Ячейки, которые не отвечают требованиям, должны быть выделены, а комментарий должен быть добавлен в столбец «Комментарий».

Требования к проверке:

  1. Отметьте имена или фамилии, которыесодержать цифры / символы - действие: выделите ячейку и добавить комментарий к колонке комментариев

  2. Проверить пустые ячейки - действие: выделить ячейку и добавить комментарий

Я пробовал по-разному (особенно с помощью оператора IF), как выделить ячейки, которые не отвечают требованиям и комментируют одновременно, но ничего не работает :( Буду признателен за некоторую поддержку

import pandas as pd
import numpy as np

df_i = pd.DataFrame({'Email' : ['john@yahoo.com','john@outlook.com','john@gmail.com'], 'First Name': ['JOHN','   roman2   ',''], 'Last Name': ['Smith','','132'], 'Comments':['','','']})
emails_to_exclude = ('@gmail', '@yahoo')

print(df_i)

#Proper names
def proper_name(name):
    return name.str.title()

df_i['First Name'] = proper_name(df_i['First Name'] )
df_i['Last Name'] = proper_name(df_i['Last Name'] )

#Trim spaces
def trim(cell):
        return cell.apply(lambda x: x.str.strip())

df_i = trim(df_i)

#Check public email domains
df_i.loc[df_i['Email'].str.contains('|'.join(emails_to_exclude), case=False),'Comments'] = df_i['Comments'].astype(str) + 'public email domain'

#Check first and last name

list_excl = ["1","2","3","4","5","6","7","8","9","0"]
df_i.loc[df_i['First Name'].str.contains('|'.join(list_excl), case=False), 'Comments']  = df_i['Comments'].astype(str) + " Check 'First Name'"
df_i.loc[df_i['Last Name'].str.contains('|'.join(list_excl), case=False), 'Comments']  = df_i['Comments'].astype(str) + " Check 'Last Name'"

print(df_i)

1 Ответ

0 голосов
/ 12 октября 2019

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

Для части форматирования используйте df.style. По сути, вы пишете функцию, которая определяет, как каждая ячейка должна быть отформатирована с использованием CSS. Вам нужно будет экспортировать в Excel (CSV не содержит никакой информации о форматировании). Вы также можете представить его в виде таблицы HTML. Читать дальше . Обратите внимание, что после использования df.style используемый вами объект больше не является pd.DataFrame. Скорее это pandas.io.formats.style.Styler. Вы должны делать все, что хотите, с вашим DataFrame до того, как его стилизовать.

import pandas as pd
import numpy as np
import re

def highlight_invalid(string, invalid_colour='yellow', empty_colour='red'):
    if string:
        # The string contains only one or more letters
        pattern = re.compile(r'^([A-z])+$')
        if pattern.match(string):
            # do not highlight valid strings
            return ''
        else:
            # highlight non-matching strings in invalid_colour
            return f'background-color: {invalid_colour}'
    else:
        # highlight empty strings in empty_colour
         return f'background-color: {empty_colour}'

cols = ['First Name', 'Last Name']
for col in cols:
    # It didn't work when I tried it with missing values, so make sure to replace
    df_i[col] = df_i[col].replace(np.nan, '')

# Apply the highlighting function to every cell of 'First Name' and 'Last Name'
df_i = df_i.style.applymap(highlight_invalid, subset=cols)

df_i.to_excel(fname)

Возможно, вы захотите написать отдельную функцию, которая выполняет проверку данных, и использовать ее как для выделения, так и для выделения. добавив комментарий. Я оставлю это вам, поскольку это не относится к форматированию как таковому и должно быть задано отдельным вопросом.

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