Python 创建一个用于处理筛选和将值导出到Excel单元格中的错误的函数

Python 创建一个用于处理筛选和将值导出到Excel单元格中的错误的函数,python,pandas,error-handling,Python,Pandas,Error Handling,我创建了一个python程序,它从许多web源中提取数据,并将结果聚合到一个数据框架中。我现在尝试将聚合表的结果放入Excel电子表格中,并定义将哪些数据放入哪些单元格中 我遇到的问题是,有时候数据框中的数据会丢失,因为它在网站上不存在。当我尝试在pandas数据帧中筛选/定位索引器时,它会导致索引器错误 为了解决这个问题,我创建了一个try/except语句,以便在出现索引器时向Excel返回一个空值。然而,这意味着每当我想在Excel单元格中插入一个值时,我都必须重复代码。为了减少行数,我决

我创建了一个python程序,它从许多web源中提取数据,并将结果聚合到一个数据框架中。我现在尝试将聚合表的结果放入Excel电子表格中,并定义将哪些数据放入哪些单元格中

我遇到的问题是,有时候数据框中的数据会丢失,因为它在网站上不存在。当我尝试在pandas数据帧中筛选/定位索引器时,它会导致索引器错误

为了解决这个问题,我创建了一个try/except语句,以便在出现索引器时向Excel返回一个空值。然而,这意味着每当我想在Excel单元格中插入一个值时,我都必须重复代码。为了减少行数,我决定编写一个函数来执行错误处理和插入值,而不是执行多个try/except语句。问题在于,函数没有完成我希望它完成的操作,如下面的“Does work and”Not work示例所示

我希望能够使用cell_insert(cell,data)将数据插入单元格,并能够为我处理一些特定的错误。也许有什么我误解了

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")

当调用函数时,在数据传递到函数之前就出现了错误。如果第二个参数引发索引器,它将永远不会在函数中传递

例如,请尝试:

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.
一个公认的笨拙解决方法是将其作为字符串传递并使用

您可以在条目周围用引号将其称为

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

重要的是不要混淆单引号和双引号。外部使用双引号,实际调用数据帧使用单引号,反之亦然。

错误永远不应以静默方式传递;打印(它们)
只是稍微更改了我的代码,并注释掉了我感到困惑的部分。这会让事情变得更容易吗?我不完全理解你的评论。谢谢。当你调用函数时,你会在数据传递到函数之前收到一个错误。如果第二个参数引发索引器,它将永远不会在函数中传递。在对其求值之前,我是否可以将其传递给函数?@RyanDavies请参见下面的答案。谢谢,这回答了我的问题!虽然如果你想要更多的分数,这会带来另一个问题,但你也必须将ws[cell]=data更改为ws[cell]=eval(data),否则它只传递字符串
cell_insert('A2', "df[(df['lead_source'] == 'C') & (df['status'] == 'Refund')].iloc[0]['total']")
#this should work