Создание функции, которая обрабатывает ошибки, обрабатывает фильтрацию панд и экспортирует значения в ячейку Excel. - PullRequest
0 голосов
/ 03 июня 2019

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

Проблема, с которой я сталкиваюсь, заключается в том, что иногда во фрейме данных отсутствуют данные, посколькуне существует на сайте.Что вызывает IndexError, когда я пытаюсь отфильтровать / найти его в фрейме данных pandas.

Чтобы устранить эту проблему, я создал оператор try / excal, который возвращает пустое значение в Excel при возникновении IndexError.Однако это означает, что каждый раз, когда я хочу вставить значение в ячейку Excel, мне приходится повторять код.Чтобы уменьшить количество строк, я решил написать функцию, которая будет обрабатывать ошибки и вставлять значение вместо нескольких операторов try / исключением.Проблема в том, что функция не выполняет то, что я ожидаю, как показано ниже с примерами # Работает и # Не работает.

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

import pandas as pd

wb = Workbook()
ws = wb.active

df_data = {
           'year_month': ['2019-06', '2019-06', '2019-06', '2019-06', '2019-06'],
           'lead_source': ['C', 'IH', 'INH', 'INH', 'MV'],
           'status': ['Lead', 'Lead', 'Lead', 'Refund', 'Lead'],
           'leads': [12, 7, 51, 2, 15],
           'total': [140, 280, 918, 36, 150]
           }
df = pd.DataFrame(df_data)

# Does work
try:
    ws['A1'] = df[(df['lead_source'] == 'C') & (df['status'] == 'Lead')].iloc[0]['total']
except IndexError:
    ws['A1'] = ''

try:
    ws['A2'] = df[(df['lead_source'] == 'C') & (df['status'] == 'Refund')].iloc[0]['total']
except IndexError:
    ws['A2'] = ''

# Doesn't work
# def cell_insert(cell, data):
#     try:
#         ws[cell] = data
#     except IndexError:
#         ws[cell] = ''
#
# cell_insert('A2', df[(df['lead_source'] == 'C') & (df['status'] == 'Refund')].iloc[0]['total'])

wb.save("stackoverflow.xlsx")

1 Ответ

1 голос
/ 03 июня 2019

Когда вы вызываете функцию, вы получаете сообщение об ошибке еще до того, как данные передаются в функцию.Если второй аргумент вызывает ошибку IndexError, она никогда не будет передана в функцию.

Например, попытайтесь:

print(df[(df['lead_source'] == 'C') & (df['status'] == 'Refund')].iloc[0]['total'])
#This will not print and return an error because the print function will never receive the input because it evaluates to an error.

Один заведомо неуклюжий обходной путь - передать его как строку и использовать eval

def cell_insert(cell, data):
    #pass data as a string
    try:
        eval(data)
    except IndexError:
        data="''"
    ws[cell] = eval(data)

Вы бы назвали это кавычками вокруг вашей записи

cell_insert('A2', "df[(df['lead_source'] == 'C') & (df['status'] == 'Refund')].iloc[0]['total']")
#this should work

Важно не смешивать одинарные и двойные кавычки.Используйте двойные кавычки для внешней стороны и одинарные для фактического обращения к кадру данных или наоборот.

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