我有一个名为Sheet1的标签。它从名为Data_Summary
的标签中过滤数据。
如果我在Sheet1的单元格A2中输入此FILTER()函数,然后按回车键:
=FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91="Assigned")
...一切正常:
但是如果我通过XLSXWriter输入:
worksheet.write_array_formula("A2:B73", "=_xlfn._xlws.FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91=\"Assigned\")")
...过滤器仍然有效,但是在被过滤的行之后的行中,我得到很多包含#N/A
的行。
我该如何纠正?
您将获得大量N / A值,因为您定义的数组要大于返回的结果。如果您要手动输入FILTER()函数,它将根据返回的结果自动完成。但是使用xlsxwriter,除了使用write_array_formula方法并定义特定范围外,我找不到其他方法来编写公式。这不方便,因为我想大多数时候您都不知道会得到多少结果。
我找到了一个解决方案,方法是计算您在范围内出现的字符串'Assigned'的出现次数,然后将此数字用作公式数组的结尾行。但这需要您通过熊猫导入数据框。据我所知,无法使用xlsxwriter读取单元格的值并稍后在公式中使用它,也许John可以对此进行更多说明。
这是根据您提供给我们的信息的可行示例:
import pandas as pd
import numpy as np
# Cretae a test df
df = pd.DataFrame({'Track Number': ['Track #1','Track #2','Track #3','Track #4','Track #5',
'Track #6','Track #7','Track #8','Track #9','Track #10'],
'Status': ['Assigned',np.nan,'Assigned',np.nan,np.nan,
'Assigned','Assigned',np.nan,np.nan,np.nan]})
# Start the xlsxwriter
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
workbook = writer.book
worksheet = workbook.add_worksheet()
# You could count them using excel's native formula but you will not be able to store it
# into a variable as the formulas are calculated when the file opens
#worksheet.write_formula('D1', '=COUNTIF(Data_Summary!B:B,"Assigned")')
# Using pandas is possible though
# Use loc or iloc for specific range, otherwise pass in the whole column df['Status']
count = df.loc[0:10,'Status'].str.count('Assigned').sum()
worksheet.write_array_formula(f'A1:B{count}', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')
# Pass the main df to a second sheet named Data_Summary
df.to_excel(writer, sheet_name='Data_Summary', index=False)
writer.save()
[OUTPUT:
主df:
如果我定义的范围大于返回的结果,例如:
worksheet.write_array_formula('A1:B8', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')
我回来了#N / As: