我有一个 DataFrame,其中某些列使用该Decimal数据类型。我想将此数据导出到 Excel 电子表格,保留十进制/数字格式。但是,我的代码却将列转换为文本格式。

df['some_col1'] = df['some_col1'].apply(lambda x: Decimal(x) if pd.notnull(x) else None)
df['some_col2'] = df['some_col2'].apply(lambda x: Decimal(x) if pd.notnull(x) else None)
output = io.BytesIO()
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
    df.to_excel(writer, index=False, sheet_name='Sheet1')
    workbook = writer.book
    worksheet = writer.sheets['Sheet1']
    
    # Define number format
    number_format = workbook.add_format({'num_format': '0.0000'})
    
    # Apply formatting based on column name
    for col_num, col_name in enumerate(df.columns):
        if col_name == 'some_col1' or col_name == 'some_col2':  # Specify by column name
              worksheet.set_column(col_num, col_num, None, number_format)

set_column即使我直接指定列(例如“A:A”),它也不起作用。您可以在电子表格中看到这种不正确的格式:

我如何才能以正确的格式导出这些数据?


最佳答案
2

已知问题。以下是 Github 问题链接:

该问题是由 Pandasto_excel方法引起的,其中decimal.Decimal将值保存为文本是由于 Pandas 无法将其识别为数字类型。

要解决此问题,您可以将小数修改为float

直接转换为浮点数

您可以直接转换为浮点数,而不必先转换为小数,然后再转换为浮点数。

df['some_col1'] = df['some_col1'].astype('float')
df['some_col2'] = df['some_col2'].astype('float')

这将被识别为数字类型,而不是 Excel 中的文本。

4

  • 为什么当您将其转换为时要转换x:为什么不直接转换为?Decimalfloatfloat


    – 

  • @Timus 是的,您可以直接转换为浮点数,这样效率更高,我只是让它与原始问题保持一致。


    – 

  • 那么为什么不使用效率低下且不必要的复杂的 -lambda 组合df['some_col1'].astype('float')呢?.apply


    – 

  • @Timus 你说得对,我这样做只是因为 OP 使用了 lambda 函数。我已将答案修改为更简单的解决方案,这应该可以更好地推广到看到此问题的其他用户。


    – 

尝试使用以下方法更改列类型:

df['some_col1'] = pd.to_numeric(df['some_col1']).apply(lambda x: float(x) if pd.notnull(x) else None)
df['some_col2'] = pd.to_numeric(df['some_col2']).apply(lambda x: float(x) if pd.notnull(x) else None)

1

  • 1
    为什么不.astype("float")采用低效的.apply(...)-lambda 组合呢?


    –