web-dev-qa-db-ja.com

パンダのフロートを整数に変換しますか?

私はCSVからインポートされたデータを扱ってきました。 Pandasはいくつかの列を浮動小数点に変更したので、これらの列の数値は浮動小数点として表示されます。ただし、整数で表示するか、カンマなしで表示する必要があります。それらを整数に変換したり、カンマを表示しない方法はありますか?

156
MJP

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
165
EdChum

.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
>>>
136
Ryan G

列名のリストを使用して、.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
25
user4322543

これは、NaN値を持つことができる場合も考慮して、Pandas DataFrame dfのより多くの列をfloatからintegerに変換する場合の迅速な解決策です。

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 ""を使いました

5
enri
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
user8051244

@Ryan Gを.astype(<type>)関数の使用法に言及して拡張すると、エラーを発生しない列のみを変換するためにerrors=ignore引数を使用することができます。これは特に構文を単純化します。明らかに、エラーを無視するときには注意が必要ですが、この作業にはとても便利です。

df = pd.DataFrame(np.random.Rand(3,4), columns=list("ABCD"))
df['E'] = list("XYZ")
df.astype(int, errors='ignore')

    A   B   C   D   E
0   0   0   0   0   X
1   0   0   0   0   Y
2   0   0   0   0   Z

astype docsから:

エラー:{「上げる」、「無視する」、デフォルトは「上げる」

提供されたdtypeに対する無効なデータに対する例外の発生を制御します。

  • raise:例外の発生を許可します
  • 無視:例外を抑制します。エラー時にオリジナルのオブジェクトを返す

バージョン0.20.0の新機能。

4
aebmad

**

すべてのfloat型列を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
1
Suhas_Pote

これは、可能な限り小さい整数型に浮動小数点変換する単純な関数ですが、安全に実行できる場合に限ります(数値の精度を損なうことなく)。つまり、100は整数から浮動小数点数に変換できますが、99.9は変換できません。

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
JohnE