我有一个 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
为:为什么不直接转换为?Decimal
float
float
– -
@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 组合呢?
–
|
|