【问题标题】:Avoid inserting formula when value starts with '='当值以 '=' 开头时避免插入公式
【发布时间】:2019-01-20 05:15:10
【问题描述】:

我最近开始使用 Pandas 库来验证和操作 .CSV 文件和 Excel 文件。 有一个问题我刚刚提到。当为 numpy 系列(Pandas DataFrame 的列)分配值并且我要分配的值以“=”开头时,Pandas 似乎将这些值解释为公式。

来源(.CSV 文件):

ID | Name | Size
--------------------------
 0 |  Foo | =500.000 cells
 1 |  Bar | Baz

结果(Excel 文件):

ID | Name | Size
----------------
 0 |  Foo | 0     <- wrong value
 1 |  Bar | Baz

当我打开生成的 Excel 文件时,会显示一条错误消息。不幸的是,错误消息是德语的,所以我会尽量翻译它:“我们检测到 'FILENAME.xlsx' 的某些内容存在问题。您要恢复内容吗?如果您信任这个工作簿,然后按‘是’。” 按“是”时,工作簿正在打开,所有应该为“=某事”的值都是“0”。其他所有值均已正确分配!

这是用于分配值的代码行。

ws.ix[some_row_index, some_col_index] = edit_set.ix[some_other_row_index, some_other_col_index].values

有没有办法绕过这个?可能是通过其他方法来分配参数或通过设置参数?

编辑: 即使我不更改/设置值,似乎也会出现问题。 因此,如果我用 Pandas 打开的 Excel 文件的初始值以 '=' 开头并且我根本不覆盖/更改该值,则在将 DataFrame 写入 to_excel 时仍然会发生错误。 我还没有找到一种方法来告诉 Pandas 在写入 Excel 文件时“忽略公式”。

所以我认为我的代码的变化应该发生在以下两行:

writer = pd.ExcelWriter(path + name, engine='xlsxwriter', options={'strings_to_urls': False})
edit_final_file.to_excel(writer, sheet_name = 'Main', index=False, encoding='utf-8')

【问题讨论】:

  • 不确定这是否是一个答案,但在 excel 中以 = 开始单元格数据的方法是在前面加上 ' 以使内容文字化。这就是单元格包含'=500 ... 而不是=500 ...
  • 对我来说,pandas 无法解析字符串“=something”中的整数。试试int("4")int("=4") 看看我的意思。因此,您的解决方案可能是找到以= 为前缀的单元格并删除=
  • 感谢您的 cmets,但不幸的是,我无法进一步实现我的目标。我将在最初的问题中编辑一些内容,因为我刚刚注意到一些关于我的问题

标签: python python-2.7 pandas numpy


【解决方案1】:

如 cmets 中所述,将 ' 添加到以 = 开头的单元格的开头:

df["Size"] = df["Size"].apply(lambda x: "'" + str(x) if str(x)[0] == "=" else x)

【讨论】:

    【解决方案2】:

    应该避免调用apply。 Pandas 内置了str 方法。

    类似这样的:

    mask = df['Size'].str.startswith('=')
    df.loc[mask, 'Size']  = "'" + df.loc[mask, 'Size']
    

    【讨论】:

    • 同意一般情况下最好避免apply,但我不相信pandas字符串方法是矢量化的,所以这只会引入开销(计算掩码等)。见答案here。字符串方法的优点是它们会跳过空值,但这不是问题,因为我们只将操作应用于以 = 开头的值
    • 有趣。我一直认为这些方法是矢量化的。感谢您的信息!
    • 是的,请参阅str.cat 来源here。看起来它只是在元素上循环
    猜你喜欢
    • 2013-01-29
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多