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
Другие вопросы по тегам