【问题标题】:Why is this diff function treating empty cells as different?为什么这个 diff 函数将空单元格视为不同?
【发布时间】:2017-06-20 14:49:11
【问题描述】:
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

我尝试了更多的东西,但这只是几个例子。我还尝试制作一个类似的功能来检测空单元格,然后将它们从它认为不同的单元格列表中删除,但我无法让它工作。

附带问题:有没有办法让它忽略区分大小写?当字母大小写不同时,它也会突出显示单元格

更多代码:

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

【问题讨论】:

  • 您将 pandas df 视为一个 numpy 数组。尝试将它们转换为 np 数组。

标签: excel python-3.x pandas dataframe diff


【解决方案1】:

第一季度:

numpy.nan 通常比较不相等

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

如果效果不好,可以使用 isnullnotnull 方法。

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

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

应该做你正在寻找的东西。

第二季度: 可以使用 .str 访问器从 pd.Series 对象(虽然不是 pd.DataFrame 对象)访问像 .upper.lower 这样的字符串方法。例如。 df[df.columns[0]].str.upper() 将返回df 第一列中的一系列值,但全部大写。

【讨论】:

  • 我收到一个错误:'ValueError:无法强制转换为 Series,长度必须为 18:给定 2'
  • @stackoa 你能发布一个数据框和代码来重现你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2014-05-30
相关资源
最近更新 更多