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