Pandas에서 float를 정수로 변환 하시겠습니까?


230

CSV에서 가져온 데이터로 작업하고 있습니다. 팬더가 일부 열을 부동으로 변경 했으므로 이제이 열의 숫자가 부동 소수점으로 표시됩니다! 그러나 정수로 표시하거나 쉼표없이 표시해야합니다. 정수로 변환하거나 쉼표를 표시하지 않는 방법이 있습니까?


22
유형을 변경할 수 있습니다 (결 측값이없는 한)df.col = df.col.astype(int)
EdChum

이 질문은 동시에 두 가지 질문이며,이 질문의 제목은 그 중 하나만 반영합니다.
Monica Heddneck

위의 내용을 명중하고 개념 df = df.astype(int)
상으로는

답변:


216

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

16
감사! 나는 to_csv에서 fin.to_csv ( 'my_table.csv', float_format = '%. f')에서 이것을 조정했습니다. 효과가 있었다!
MJP

4
팬더의 최신 버전에서는 경고 피하기 위해 astype의 주장에 거짓 사본을 = 추가 할 필요가
g.stevo

해야 df.a = df.a.astype(float)합니까? 이것은 사본을 작성합니까 ( copyparam이 어떻게 astype()사용 되는지 확실하지 않습니까)? 어쨌든 "in place"유형을 업데이트 하시겠습니까?
Mr_and_Mrs_D

1
@ EdChum, Pandas가 유형을 변환하지 못하게하는 방법이 있습니까? 예를 들어보십시오 DF.({'200': {'#': 354, '%': 0.9971830985915493}, '302': {'#': 1, '%': 0.0028169014084507044}}) . #은 부동으로 변환되며 열이 아닌 행입니다. 각각 Series단일 유니폼 유형 만 저장할 수 있기 때문에 ?
alancalvitti 2016

@alancalvitti 여기서 가치를 보존하려는 의도는 무엇 dtype입니까? 그렇다면 혼합 할 수 있도록 dtype열을 만들어야합니다 dtype object. 그렇지 않으면 플로트를 사용하고 비교를 할 때 조언을 사용하는 것이 좋습니다np.isclose
EdChum

180

pandas.DataFrame.astype(<type>)함수를 사용하여 열 dtype을 조작 하십시오 .

>>> 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
나는 당신의 접근 방식을 시도하고 나에게 ValueError를 준다 : NA를 정수로 변환 할 수 없다
MJP

6
@MJP 누락 된 값이 있으면 series를 float에서 integer로 변환 할 수 없습니다. pandas.pydata.org/pandas-docs/stable/…을 참조하십시오. float를 사용해야합니다
EdChum

2
값이 누락되지 않았지만 열은 의도적으로 각 행의 값을 지정하지 않습니다. 해결 방법을 얻을 수있는 방법이 있습니까? 이러한 값은 외래 키 ID이므로 정수가 필요합니다.
MJP

4
모든 NaN이 0.0으로 바뀌는 편집을했습니다.
Ryan G

3
또는 CSV를 수정하는 경우 df.to_csv ( "path.csv", na_rep = "", float_format = "%. 0f", index = False) 그러나 모든 부동 소수점을 편집하므로 FK 열을 문자열로 변환하고 조작 한 다음 저장하는 것이 좋습니다.
Ryan G

44

다음 데이터 프레임을 고려하십시오.

>>> df = pd.DataFrame(10*np.random.rand(3, 4), columns=list("ABCD"))
>>> print(df)
...           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

열 이름 목록을 사용하여 다음을 사용하여 여러 열의 유형을 변경하십시오 applymap().

>>> cols = ['A', 'B']
>>> df[cols] = df[cols].applymap(np.int64)
>>> print(df)
...    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

또는 단일 열의 경우 apply():

>>> df['C'] = df['C'].apply(np.int64)
>>> print(df)
...    A  B  C         D
... 0  8  0  1  6.226750
... 1  1  9  9  8.522808
... 2  1  4  2  7.739108

5
값에 NaN이 있으면 어떻게됩니까?
Zhang18

3
@ Zhang18이 솔루션을 시도했는데 NaN의 경우 다음 오류가 발생합니다.ValueError: ('cannot convert float NaN to integer', u'occurred at index <column_name>')
enri

2
@enri : 다음 코드를 시도해보십시오 –df['C'] = df['C'].dropna().apply(np.int64)
vsdaking

12

pandas.DataFrameNaN 값을 가질 수있는 경우를 고려하여 부동 소수점에서 정수 로 더 많은 열을 변환하려는 경우 빠른 솔루션입니다 .

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 "".


""col
Raheel

필요한 경우 모든 누락 된 값에 빈 문자열 ( "")을 적용하지만 나머지 값은 정수입니다.
Krzysztof Słowiński

고마워 .astype () 및 .apply (np.int64)가 작동하지 않았을 때 작동했습니다.
Alison S

이것은 해킹 된 느낌이 들며 사용 가능한 많은 대안을 통해 사용할 이유가 없습니다.
AMC

8

@Ryan G에서 언급 된 pandas.DataFrame.astype(<type>)메소드 사용법을 확장 하면 errors=ignore인수를 사용하여 오류가 발생하지 않는 열만 변환 할 수 있으므로 구문이 매우 간단 해집니다. 분명히 오류를 무시할 때는주의를 기울여야하지만이 작업에는 매우 편리합니다.

>>> df = pd.DataFrame(np.random.rand(3, 4), columns=list('ABCD'))
>>> df *= 10
>>> print(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')
>>> print(df)
...     A   B   C   D   E
... 0   2   8   1   6   X
... 1   5   9   5   4   Y
... 2   0   4   1   4   Z

에서 pandas.DataFrame.astype의 문서 :

오류 : { 'raise', 'ignore'}, 기본 'raise'

제공된 dtype에 대해 유효하지 않은 데이터에 대한 예외 발생을 제어합니다.

  • raise : 예외가 발생하도록 허용
  • 무시 : 예외를 억제합니다. 오류 발생시 원본 객체 반환

버전 0.20.0의 새로운 기능


7
>>> import pandas as pd
>>> right = pd.DataFrame({'C': [1.002, 2.003], 'D': [1.009, 4.55], 'key': ['K0', 'K1']})
>>> print(right)
           C      D key
    0  1.002  1.009  K0
    1  2.003  4.550  K1
>>> right['C'] = right.C.astype(int)
>>> print(right)
       C      D key
    0  1  1.009  K0
    1  2  4.550  K1

5

모든 float 열을 int로 변환하려면

>>> df = pd.DataFrame(np.random.rand(5, 4) * 10, columns=list('PQRS'))
>>> print(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')
>>> print(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

0

다음은 정보를 잃지 않는 가장 작은 정수 유형으로 다운 캐스트되는 간단한 함수입니다. 예를 들어,

  • 100.0은 float에서 정수로 변환 할 수 있지만 99.9는 반올림 또는 잘림으로 정보를 잃지 않고는 변환 할 수 없습니다

  • 또한 1.0은 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])

0

int로 변환 해야하는 열은 다음과 같이 사전에서 언급 할 수 있습니다

df = df.astype({'col1': 'int', 'col2': 'int', 'col3': 'int'})

-5
>>> df_18['cyl'].value_counts()
... 4.0     365
... 6.0     246
... 8.0     153

>>> df_18['cyl'] = df_18['cyl'].astype(int)
>>> df_18['cyl'].value_counts()
... 4     365
... 6     246
... 8     153

1
astype(int)이미 여러 번 언급되었습니다. 이 답변은 새로운 것을 추가하지 않습니다.
Georgy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.