2017-06-20 39 views
1
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文件并突出显示不同的单元格。我正在使用熊猫数据框。这个函数的问题在于它突出显示空单元,就好像它们不同。我试过几件事:为什么这个diff函数将空细胞视为不同的东西?

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

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

旁边的问题:有没有办法让它忽略区分大小写?它还强调细胞时字母的大小写不同

更多的代码:

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() 
+0

你正在将熊猫df视为一个numpy数组。尝试将它们转换为np数组。 – Aaron

回答

0

Q1:

numpy.nan不会比较相等,作为一项规则

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

对于这种情况,如果效果不好,可以采用方法isnullnotnull

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

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

应该做你要找的内容。

Q2:.upper.lower String方法可以从pd.Series对象(未pd.DataFrame对象虽然)与.str存取来访问。例如。 df[df.columns[0]].str.upper()会返回第一列df中的一系列值,但全部大写。

+0

我得到一个错误:'ValueError:无法强制到系列,长度必须是18:给出2' – stackoa

+0

@stackoa你能发布一个数据框和代码来重现你的问题吗? – EFT

相关问题