0

Необходимо найти сумму столбца sum в диапазоне строк 259-368.Для этого нужно перевести тип столбца в int или float. Но выдает ошибку ValueError: could not convert string to float: '11\xa0693,70' https://drive.google.com/drive/folders/1Gvg1WdBLdaXmLraoslhHn1PG1P4jqiYH

import numpy as np
import pandas as pd
df = pd.read_csv("data.csv")
#print(test.index)
#print(test.columns)
df['sum'] = df['sum'].astype(float).fillna(0)
general_sum = df.loc[259:368, 'sum'].sum()
print(sum1)
задан 20 сент. 2023 в 19:22
8
  • 1
    вы предлагаете нам воспользоваться телепатией, чтобы узнать, что у вас там в data.csv? Commented 20 сент. 2023 в 19:37
  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. Commented 20 сент. 2023 в 19:41
  • Извините. Добавил ссылку Commented 20 сент. 2023 в 20:05
  • по вашей ссылке нет доступа к файлу. в любом случае, принципиальный ответ я вам дал. Commented 20 сент. 2023 в 20:46
  • Изменил статус доступа. Теперь открыт. Commented 21 сент. 2023 в 5:23

4 ответа 4

2

выдает ошибку ValueError: could not convert string to float: 11\xa0693,70

Символ \xa0 - это nbsp, неразрывный пробел.
Он используется в числах вместо обычного пробела (разделителя тысяч), чтобы в тексте число 11 693,70 не разбилось переносом строки на два числа 11 и 693,70.
А библиотечные функции обычно знают только про обычный пробел и не знают про его многочисленные разновидности за пределами ASCII7.

Как пофиксить: перед конвертацией строки в число нужно преобразовывать строку (т.е., весь csv-файл), заменяя все возможные пробелы на обычные пробелы. На практике при работе с русскими текстами мне всегда хватало преобразования одного только nbsp.

ответ дан 20 сент. 2023 в 22:10
1
  • Спасибо. Большое за помощь и разъяснения. А вот этот метод pd.to_numeric не будет работать для достижения нужного результата? И есть ли какой то универсальный способ заменить все возможные пробелы или это и есть универсальный? Commented 21 сент. 2023 в 11:57
0

В подобных вопросах нужно приводить пример исходных данных, чтобы проблему можно было воспроизвести. В общем же случае, воспользуйтесь методом pd.to_numeric с указанием обработки ошибок. Например:

import pandas as pd
df=pd.DataFrame({"sum":[1,13,"abv", None, True]})
print(df)
print(df.dtypes)
 sum
0 1
1 13
2 abv
3 None
4 True
sum object <--- строки
dtype: object
df["sum"] = pd.to_numeric(df["sum"], errors="coerce").fillna(0)
print(df)
print(df.dtypes)
 sum
0 1.0
1 13.0
2 0.0
3 0.0
4 1.0
sum float64 <--- числа
dtype: object
ответ дан 20 сент. 2023 в 19:45
0

В дополнение к совершенно правильному ответу @ESkri внесу техническую часть.
Удаление \xa0 - ключевой момент, но нужно сначала привести все значения в столбце к типу str перед заменой символов, а перед преобразованием во float еще заменить запятые на точки.

df = pd.read_csv(r'c:\test\data.csv')
df['sum'] = df['sum'].fillna(0).astype(str).str.replace('\xa0', '').str.replace(',', '.').astype(float)
general_sum = df.loc[259:368, 'sum'].sum()
print(general_sum)
861874.1699999997
ответ дан 21 сент. 2023 в 6:05
0

Можно не удалять в исходном файле, а выставить в read_csv параметр thousands = '\xa0'

ответ дан 2 авг. 2024 в 10:18

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.