pandas.read_html не поддерживает десятичную запятую
Я читал файл xlm используя pandas.read_html
и работает почти идеально, проблема в том, что файл имеет запятые в качестве десятичных разделителей вместо точек (по умолчанию в read_html
).
Я мог бы легко заменить запятые точками в одном файле, но у меня есть почти 200 файлов с этой конфигурацией. с pandas.read_csv
Вы можете определить десятичный разделитель, но я не знаю, почему в pandas.read_html
Вы можете определить только разделитель тысяч.
какое-либо руководство в этом вопросе?, есть другой способ автоматизировать замену запятой / точки, прежде чем она будет открыта пандами? заранее спасибо!
4 ответа
Спасибо @zhqiat. Я думаю, что обновление pandas
к версии 0.19
решит проблему. к сожалению, я не смог найти простой способ сделать это. Я нашел руководство по обновлению Pandas, но для Ubuntu (пользователь WinXP).
Наконец, я выбрал обходной путь, используя метод, опубликованный здесь, по сути, преобразовав все столбцы один за другим в числовой тип pandas.Series
result[col] = result[col].apply(lambda x: x.str.replace(".","").str.replace(",","."))
Я знаю, что это решение не самое лучшее, но работает. Спасибо
Это не начало работать для меня, пока я не использовал и десятичные =',' и тысячи ='.'
Версия для панд: 0.23.4
Поэтому попробуйте использовать как десятичные, так и тысячи: т.е.pd.read_html(io="http://example.com", decimal=',', thousands='.')
Раньше я использовал только decimal =',', и числовые столбцы были бы сохранены как тип str с числами, просто пропускающими запятую.(Странное поведение) Например, 0,7 будет "07", а "1,9" будет "19"
Он все еще сохраняется в кадре данных как тип str, но по крайней мере мне не нужно вручную вводить точки. Числа правильно отображаются; 0,7 -> "0,7"
Глядя на исходный код read_html
def read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False,
tupleize_cols=False, thousands=',', encoding=None,
decimal='.', converters=None, na_values=None,
keep_default_na=True):
Заголовок функции предполагает наличие десятичного разделителя в вызове функции.
Далее в документации это выглядит так, как будто оно было добавлено в версии 0.19 (поэтому немного дальше по экспериментальной ветке). Можете ли вы обновить свои панды?
десятичный: str, по умолчанию '.' Символ для распознавания в качестве десятичной точки (например, используйте ',' для европейских данных). .. версия добавлена :: 0.19.0
Я использую панды 0.19, но она по-прежнему не может правильно преобразовать числа.
Например:
a=pd.read_html(r.text,thousands='.',decimal=',')
распознает значение "1.401,40" в ячейке таблицы как 140140 (с плавающей запятой).
Я использую аналогичное решение, как "Pablo A", просто исправляя значения nan:
def to_numeric_comma(series):
new=series.apply(lambda x: str(x).replace('.','').replace(',','.'))
new=pd.to_numeric(new.replace('nan',pd.np.nan))
return new