创建一个函数,该函数错误地处理熊猫筛选并将值导出到 Excel 单元格中



我创建了一个python程序,该程序可以从许多Web资源中抓取数据,并将结果聚合到一个数据框中。我现在正在尝试将聚合表的结果放入 Excel 电子表格中,并定义要放入哪些单元格的数据。

我遇到的问题是,有时数据框中会缺少数据,因为它在网站上不存在。当我尝试在熊猫数据框中过滤/定位它时,这会导致索引错误。

为了解决这个问题,我创建了一个try/except 语句,以便在发生索引错误时向Excel返回一个空白值。但是,这意味着每次我想在 Excel 单元格中插入值时,我都必须重复代码。为了减少行数,我决定编写一个函数来处理错误并插入值,而不是执行多个 try/except 语句。问题是该函数没有做我希望它做的事情,如下所示,#有效和#不起作用示例。

我希望能够使用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")

当你调用函数时,在数据传递给函数之前,你会收到一个错误。如果第二个参数引发 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

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

最新更新