Панды - Как игнорировать проценты в read_excel и read_csv - PullRequest
0 голосов
/ 25 августа 2018

У меня есть приложение, которое позволяет пользователю обновить файл Excel (.xlsx) или CSV (.csv). Я использую pandas.read_excel и pandas.read_csv для чтения файлов. Это прекрасно работает для числовых значений. Однако, когда столбец имеет 80%,, он анализируется как 0.8. Есть ли способ игнорирования процентов при чтении файлов CSV или Excel? Таким образом, ячейка с 80% анализируется как 80 в кадре данных.

Я подумал о том, чтобы проверить, все ли значения в кадре данных меньше 1, но это приведет к ошибке, потому что, если пользователь вводит нули в файл Excel (что возможно), это будет интерпретироваться как процент, который составит умножить на 100.

1 Ответ

0 голосов
/ 25 августа 2018

Excel хранит проценты в десятичных числах. Представление% - это просто «представление» данных, а не свойство базового значения float. Если вы заранее не знаете своих столбцов, вы можете определить логику расследования: -

Сначала прочитайте ваш файл как обычно (Excel или CSV):

df = pd.read_excel('file.xlsx')  # or pd.read_csv('file.csv')

Затем укажите столбцы, которые читаются как float:

float_cols = df.select_dtypes(include=[np.float]).columns

Теперь фильтр для тех столбцов, где все значения находятся в диапазоне от 0 до 1,0. Это не является водонепроницаемым, так как серия Boolean также будет включена. Таким образом, мы можем добавить дополнительное условие, чтобы было не менее n различных значений.

pct_cols = [x for x in float_cols if df[x].between(0, 1).all() and len(df[x].unique()) > 2]

Наконец, преобразовать десятичные дроби в диапазоне [0, 1] в проценты в диапазоне [0, 100]:

df[pct_cols] = df[pct_cols] * 100

Вот полный рабочий пример:

df = pd.DataFrame({'A': [0.1341234, 0.563465, 1.00, 0.00, 0.456546],
                   'B': [True, False, True, True, True],
                   'C': [1.0, 0.0, 1.0, 1.0, 0.0]})

float_cols = df.select_dtypes(include=[np.float]).columns
pct_cols = [x for x in float_cols if df[x].between(0, 1).all() and len(df[x].unique()) > 2]
df[pct_cols] = df[pct_cols] * 100

print(df)

           A      B    C
0   13.41234   True  1.0
1   56.34650  False  0.0
2  100.00000   True  1.0
3    0.00000   True  1.0
4   45.65460   True  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...