为什么这个差异函数将空单元看作是不同的?

def find_diffs(dataframe1, dataframe2): # Finds diff cells and stores to list x_ofs = dataframe1.columns.nlevels + 1 y_ofs = dataframe1.index.nlevels + 1 return([column_letter(x + x_ofs) + str(y + y_ofs) for y, x in zip(*np.where(dataframe1 != dataframe2))]) 

我正在做一个Python脚本来区分2个Excel文件,并突出显示不同的单元格。 我正在使用一个pandas数据框。 这个函数的问题是它突出显示空单元,就好像它们不同。 我已经尝试了几件事情:

  (dataframe1 != dataframe2) and dataframe2 != '' (dataframe1 != dataframe2) and dataframe2 != 'nan' (dataframe1 != dataframe2) & dataframe2 != nan 

我尝试了更多的东西,但这只是一些例子。 我也试着做一个类似的function来检测空单元格,然后从它认为不同的单元格列表中删除它们,但我无法得到这个工作。

侧面的问题:有没有办法让它忽略区分大小写? 当字母不同的情况下,它也会突出显示单元格

更多的代码:

 df1 = pd.read_excel(mxln, header=None) # Loads master xlsx for comparison df2 = pd.read_excel(sfcn, header=None) # Loads student xlsx for comparison df3 = df2.to_excel('TEACHER COPY ' '[' + sname + '].xlsx') # difference = df2[df2 != df1] # Scans for differences # print(difference) def find_diffs(dataframe1, dataframe2): # Finds diff cells and stores to list x_ofs = dataframe1.columns.nlevels + 1 y_ofs = dataframe1.index.nlevels + 1 return([column_letter(x + x_ofs) + str(y + y_ofs) for y, x in zip(*np.where(dataframe1 != dataframe2) & (dataframe2.notnull()))]) # print(find_diffs(df1, df2)) # find_diffs(df1, df2) # print(find_diffs(df1, df2)) test0 = 'TEACHER COPY ' '[' + sname + '].xlsx' test = load_workbook(test0) test1 = test.active test2 = test.save(test0) test3 = test1 # test4 = test.active def color_red(): redFill = PatternFill(start_color='FFEE1111', end_color='FFEE1111', fill_type='solid') for cell in find_diffs(df1, df2): # find_diffs(df1, df2) # print(cell) test3[cell].fill = redFill test.save(test0) #return(color_red) # Leave commented otherwise only colors 1st cell in list color_red() def count_red(): errors = str(len(find_diffs(df1, df2))) # print(errors) return(errors) def write_errors(): wb = load_workbook(filename=test0) ws = wb.worksheets[0] ws['A27'] = 'Errors: ' + count_red() wb.save(test0) write_errors() 

Q1:

作为一个规则, numpy.nan不会相等

 a = np.nan a == a Out[61]: False 

因为当这样做不好的时候,有方法是notnull和不notnull

考虑到这一点,你的最后一次尝试是非常接近的:

 np.where((dataframe1 != dataframe2) & (dataframe2.notnull())) 

应该做你想要的。

Q2:使用.str访问器可以从pd.Series对象(不是pd.DataFrame对象)访问.upper.lower等string方法。 例如df[df.columns[0]].str.upper()将在df的第一列中返回一系列值,但都是大写的。