Я работал с данными, импортированными из CSV. Панды изменили некоторые столбцы на плавающие, так что теперь числа в этих столбцах отображаются как плавающие точки! Однако мне нужно, чтобы они отображались как целые числа или без запятой. Есть ли способ преобразовать их в целые числа или не отображать запятую?
Преобразовать float в ints в Pandas?
Ответ 1
Чтобы изменить выход float, сделайте следующее:
df= pd.DataFrame(range(5), columns=['a'])
df.a = df.a.astype(float)
df
Out[33]:
a
0 0.0000000
1 1.0000000
2 2.0000000
3 3.0000000
4 4.0000000
pd.options.display.float_format = '{:,.0f}'.format
df
Out[35]:
a
0 0
1 1
2 2
3 3
4 4
Ответ 2
Используйте .astype(<type>)
для управления типами столбцов.
>>> df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
>>> df
A B C D
0 0.542447 0.949988 0.669239 0.879887
1 0.068542 0.757775 0.891903 0.384542
2 0.021274 0.587504 0.180426 0.574300
>>> df[list("ABCD")] = df[list("ABCD")].astype(int)
>>> df
A B C D
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
РЕДАКТИРОВАТЬ:
Для обработки пропущенных значений:
>>> df
A B C D
0 0.475103 0.355453 0.66 0.869336
1 0.260395 0.200287 NaN 0.617024
2 0.517692 0.735613 0.18 0.657106
>>> df[list("ABCD")] = df[list("ABCD")].fillna(0.0).astype(int)
>>> df
A B C D
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
>>>
Ответ 3
Используя список имен столбцов, измените тип для нескольких столбцов с помощью .applymap() или для одного столбца с .apply().
df = pd.DataFrame(10*np.random.rand(3, 4), columns=list("ABCD"))
A B C D
0 8.362940 0.354027 1.916283 6.226750
1 1.988232 9.003545 9.277504 8.522808
2 1.141432 4.935593 2.700118 7.739108
cols = ['A', 'B']
df[cols] = df[cols].applymap(np.int64)
A B C D
0 8 0 1.916283 6.226750
1 1 9 9.277504 8.522808
2 1 4 2.700118 7.739108
df['C'] = df['C'].apply(np.int64)
A B C D
0 8 0 1 6.226750
1 1 9 9 8.522808
2 1 4 2 7.739108
Ответ 4
import pandas as pd;
right = pd.DataFrame({'C': [1.002, 2.003],
'D': [1.009, 4.55],
"key":['K0', 'K1']})
C D key
0 1.002 1.009 K0
1 2.003 4.550 K1
right['C'] = right.C.astype(int)
C D key
0 1 1.009 K0
1 2 4.550 K1
Ответ 5
Это быстрое решение, если вы хотите преобразовать больше столбцов вашего Pandas DataFrame df из float в integer, учитывая также случай, когда вы можете иметь значения NaN.
cols = ['col_1', 'col_2', 'col_3', 'col_4']
for col in cols:
df[col] = df[col].apply(lambda x: int(x) if x == x else "")
Я пробовал:
else x)
else None)
но результат все еще имеет число с плавающей точкой, поэтому я использовал else ""
Ответ 6
Расширяя @Ryan G упомянутое использование функции .astype(<type>)
, можно использовать аргумент errors=ignore
чтобы преобразовывать только те столбцы, которые не вызывают ошибку, что заметно упрощает синтаксис. Очевидно, следует соблюдать осторожность при игнорировании ошибок, но для этой задачи это очень удобно.
df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
df *= 10
df
A B C D
0 2.16861 8.34139 1.83434 6.91706
1 5.85938 9.71712 5.53371 4.26542
2 0.50112 4.06725 1.99795 4.75698
df['E'] = list("XYZ")
df.astype(int, errors='ignore')
A B C D E
0 2 8 1 6 X
1 5 9 5 4 Y
2 0 4 1 4 Z
Из Astype Docs:
ошибки: {'повысить, игнорировать}, по умолчанию' повысить
Контроль возникновения исключений для недействительных данных для предоставленного dtype.
- поднять: разрешить возбудить исключения
- игнорировать: исключить исключения. При ошибке вернуть исходный объект
Новое в версии 0.20.0.
Ответ 7
**
Преобразовать все плавающие столбцы в int
**
df = pd.DataFrame(np.random.rand(5,4) * 10, columns=list("PQRS"))
df
P Q R S
0 4.395994 0.844292 8.543430 1.933934
1 0.311974 9.519054 6.171577 3.859993
2 2.056797 0.836150 5.270513 3.224497
3 3.919300 8.562298 6.852941 1.415992
4 9.958550 9.013425 8.703142 3.588733
float_col = df.select_dtypes(include = ['float64']) # This will select float columns only
# list(float_col.columns.values)
for col in float_col.columns.values:
df[col] = df[col].astype('int64')
df
P Q R S
0 4 0 8 1
1 0 9 6 3
2 2 0 5 3
3 3 8 6 1
4 9 9 8 3
Ответ 8
Здесь простая функция, которая будет понижать число, переходит в наименьший возможный целочисленный тип, который не теряет никакой информации. Например,
-
100.0 может быть преобразовано из числа с плавающей точкой в целое число, но 99.9 не может (без потери информации для округления или усечения)
-
Кроме того, 1.0 может быть
int8
доint8
без потери информации, но наименьший целочисленный тип для 100_000.0 -int32
Примеры кода:
import numpy as np
import pandas as pd
def float_to_int( s ):
if ( s.astype(np.int64) == s ).all():
return pd.to_numeric( s, downcast='integer' )
else:
return s
# small integers are downcast into 8-bit integers
float_to_int( np.array([1.0,2.0]) )
Out[1]:array([1, 2], dtype=int8)
# larger integers are downcast into larger integer types
float_to_int( np.array([100_000.,200_000.]) )
Out[2]: array([100000, 200000], dtype=int32)
# if there are values to the right of the decimal
# point, no conversion is made
float_to_int( np.array([1.1,2.2]) )
Out[3]: array([ 1.1, 2.2])
Ответ 9
df_18['cyl'].value_counts()
4.0 365
6,0 246
8,0 153
Имя: cyl, dtype: int64 В [38]:
int df_18 ['cyl'] = df_18 ['cyl']. astype (int)
4 365
6 246
8 153
Имя: cyl, dtype: int64