Python df.для excel () сохранение чисел в виде текста в excel. Как сохранить как значение?

Я соскабливаю данные таблицы из Google finance через pd.read_html, а затем сохранение этих данных в excel через df.to_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, Как сохранить их как фактические значения, а не текст?

4 ответов


рассмотрите возможность преобразования числовых столбцов в поплавки с pd.read_html читает данные как строковые типы (т. е. объектов). Но перед преобразованием в поплавки вам нужно заменить дефисы на NaNs:

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

в дополнение к другим решениям, где строковые данные преобразуются в числа при создании или использовании фрейма данных, также можно сделать это с помощью параметров xlsxwriter двигатель:

writer = pd.ExcelWriter('output.xlsx',
                        engine='xlsxwriter',
                        options={'strings_to_numbers': True})

С docs:

strings_to_numbers: включить worksheet.write() метод для преобразования строк в числа, где это возможно, используя float() во избежание предупреждения Excel о "числах, хранящихся в виде текста".


вы проверили, что столбцы, которые вы экспортируете, на самом деле являются числами в python (int или float)?

кроме того, вы можете преобразовать текстовые поля в числа в excel с помощью функции =VALUE ().


начиная с pandas 0.19, вы можете предоставить аргумент na_values в pd.read_html, который позволит панд правильно автоматически выводить тип float для ваших ценовых столбцов...

вот как это будет выглядеть:

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, если один из столбцов (data) содержит что-либо, что является не конвертируемый в поплавок...