Python df.to_excel() 将数字作为文本存储在 excel 中。如何存储为价值?

Posted

技术标签:

【中文标题】Python df.to_excel() 将数字作为文本存储在 excel 中。如何存储为价值?【英文标题】:Python df.to_excel() storing numbers as text in excel. How to store as Value? 【发布时间】:2017-04-26 03:31:43 【问题描述】:

我正在通过 pd.read_html 从 google 财务中抓取表格数据,然后通过df.to_excel() 将该数据保存到 excel 中,如下所示:

    dfs = pd.read_html('https://www.google.com/finance?q=NASDAQ%3AGOOGL&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM', flavor='html5lib')
    xlWriter = pd.ExcelWriter(output.xlsx, engine='xlsxwriter')

    for i, df in enumerate(dfs):
        df.to_excel(xlWriter, sheet_name='Sheet'.format(i))
    xlWriter.save()

但是,保存到 Excel 中的数字以文本形式存储,单元格一角带有绿色小三角形。将这些数据移动到 Excel 时,如何将它们存储为实际值而不是文本?

【问题讨论】:

那些列是如何与 pandas 一起出现的:print(df.dtypes)?可能需要进行转化。 看起来它们都被列为“对象”。我需要做什么才能运行到“float”或“int”的转换?在点击 excel 之前,我找不到任何关于转换为值的信息。 感谢@gluc7 的支持。重新阅读您的问题,我认为编辑其标题是一个好主意(如果可能,不确定,我对 SO 还是很陌生),因为问题不在于 df.to_excel 方法......而且这些解决方案不处理任何特定于导出到 Excel 的事情。 【参考方案1】:

您是否确认要导出的列实际上是 python 中的数字(int 或 float)?

或者,您可以使用 =VALUE() 函数将文本字段转换为 Excel 中的数字。

【讨论】:

对不起,我还是 python 新手。你如何检查它们是否真的是数字?我尝试了“类型”功能,但我不相信它适用于变量。我还想尝试在python中完成大部分工作,以便excel工作簿在打开时已经转换。 试试df.dtypes。如果需要转换,请使用pd.to_numeric()【参考方案2】:

考虑将数字列转换为浮点数,因为 pd.read_html 将 Web 数据读取为字符串类型(即对象)。但在转换为浮点数之前,您需要将连字符替换为 NaN:

import pandas as pd
import numpy as np

dfs = pd.read_html('https://www.google.com/finance?q=NASDAQ%3AGOOGL' +
                   '&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM', flavor='html5lib')
xlWriter = pd.ExcelWriter('Output.xlsx', engine='xlsxwriter')
workbook = xlWriter.book

for i, df in enumerate(dfs):
    for col in df.columns[1:]:                  # UPDATE ONLY NUMERIC COLS 
        df.loc[df[col] == '-', col] = np.nan    # REPLACE HYPHEN WITH NaNs
        df[col] = df[col].astype(float)         # CONVERT TO FLOAT   

    df.to_excel(xlWriter, sheet_name='Sheet'.format(i))

xlWriter.save()

【讨论】:

【参考方案3】:

从 pandas 0.19 开始,您可以将参数 na_values 提供给 pd.read_html,这将允许 pandas 正确地自动将浮点类型推断到您的价格列...

如下所示:

dfs = pd.read_html(
    'https://www.google.com/finance?q=NASDAQ%3AGOOGL&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM',
    flavor='html5lib',
    index_col='\nIn Millions of USD (except for per share items)\n',
    na_values='-'
)

xlWriter = pd.ExcelWriter('Output.xlsx', engine='xlsxwriter')
for i, df in enumerate(dfs):
    df.to_excel(xlWriter, sheet_name='Sheet'.format(i))
xlWriter.save()

或者(如果您还没有 pandas 0.19),我会使用@Parfait 解决方案的更简单版本:

dfs = pd.read_html(
    'https://www.google.com/finance?q=NASDAQ%3AGOOGL&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM',
    flavor='html5lib',
    index_col='\nIn Millions of USD (except for per share items)\n'
)

xlWriter = pd.ExcelWriter('Output.xlsx', engine='xlsxwriter')
for i, df in enumerate(dfs):
    df.mask(df == '-').astype(float).to_excel(xlWriter, sheet_name='Sheet'.format(i))
xlWriter.save()

仅当您正确定义索引列(在 .read_html 中)时,第二种解决方案才有效,如果其中一个(数据)列包含任何 不可 可转换的内容,它将惨遭失败并出现 ValueError到一个浮动...

【讨论】:

【参考方案4】:

除了在创建或使用数据框时将字符串数据转换为数字的其他解决方案之外,还可以使用xlsxwriter 引擎的选项来实现:

# Versions of Pandas >= 1.3.0:
writer = pd.ExcelWriter('output.xlsx',
                        engine='xlsxwriter',
                        engine_kwargs='options': 'strings_to_numbers': True)

# Versions of Pandas < 1.3.0:
writer = pd.ExcelWriter('output.xlsx',
                        engine='xlsxwriter',
                        options='strings_to_numbers': True)

来自docs:

strings_to_numbers:启用worksheet.write() 方法以将字符串转换为数字,尽可能使用float(),以避免出现有关“数字存储为文本”的 Excel 警告。 p>

【讨论】:

这是实际的解决方案。非常感谢。我的数据框确实混合了字符串和浮点数,所以该列显然是对象。但我仍然希望 Excel 将数字显示为数字【参考方案5】:

这可能是因为显示警告的那些列的数据类型是objects,而不是数字类型,例如intfloat

为了检查DataFrame每一列的Data Types,使用dtypes,比如

print(df.dtypes)

在我的例子中,存储为对象而不是数值的列是PRECO_ES

在我的特殊情况下,十进制数是相关的,我已使用astype 将其转换为浮点数,如下所示

df['PRECO_ES'] = df['PRECO_ES'].astype(float)

如果我们再次检查数据类型,我们会得到以下结果

然后,您所要做的就是将 DataFrame 导出到 Excel

#Export the DataFRame (df) to XLS
xlsFile = "Preco20102019.xls"
df.to_excel(xlsFile)

#Export the DataFRame (df) to CSV
csvFile = "Preco20102019.csv"
df.to_csv(csvFile)

如果我随后打开 Excel 文件,我可以看到警告不再显示,因为值存储为数字而不是文本

【讨论】:

对于那些使用字符串调用:df_employees[col].astype(pd.StringDtype())【参考方案6】:

如果您希望您的 Excel 工作表具有字符串数据类型,请执行以下操作:

for col in original_columns:
    df_employees[col] = df_employees[col].astype(pd.StringDtype())

【讨论】:

AttributeError: module 'pandas' has no attribute 'StringDtype' for Version 0.23.4 @NikoTumi 嘿,你能解决你的问题吗?我没有时间及时回复,但如果您的代码仍有问题,我可以提供帮助

以上是关于Python df.to_excel() 将数字作为文本存储在 excel 中。如何存储为价值?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas读取文件

将超链接添加到由 pandas 数据框 to_excel 方法创建的 excel 表

python进阶之---pandas

循环遍历python中的数据框字典

用python写CSVEXCEL文件

如何将Pandas DataFrame转换为类似字节的对象