Я создал программу на 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")