Python 创建一个用于处理筛选和将值导出到Excel单元格中的错误的函数
我创建了一个python程序,它从许多web源中提取数据,并将结果聚合到一个数据框架中。我现在尝试将聚合表的结果放入Excel电子表格中,并定义将哪些数据放入哪些单元格中 我遇到的问题是,有时候数据框中的数据会丢失,因为它在网站上不存在。当我尝试在pandas数据帧中筛选/定位索引器时,它会导致索引器错误 为了解决这个问题,我创建了一个try/except语句,以便在出现索引器时向Excel返回一个空值。然而,这意味着每当我想在Excel单元格中插入一个值时,我都必须重复代码。为了减少行数,我决定编写一个函数来执行错误处理和插入值,而不是执行多个try/except语句。问题在于,函数没有完成我希望它完成的操作,如下面的“Does work and”Not work示例所示 我希望能够使用cell_insert(cell,data)将数据插入单元格,并能够为我处理一些特定的错误。也许有什么我误解了Python 创建一个用于处理筛选和将值导出到Excel单元格中的错误的函数,python,pandas,error-handling,Python,Pandas,Error Handling,我创建了一个python程序,它从许多web源中提取数据,并将结果聚合到一个数据框架中。我现在尝试将聚合表的结果放入Excel电子表格中,并定义将哪些数据放入哪些单元格中 我遇到的问题是,有时候数据框中的数据会丢失,因为它在网站上不存在。当我尝试在pandas数据帧中筛选/定位索引器时,它会导致索引器错误 为了解决这个问题,我创建了一个try/except语句,以便在出现索引器时向Excel返回一个空值。然而,这意味着每当我想在Excel单元格中插入一个值时,我都必须重复代码。为了减少行数,我决
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