Mengonversi string menjadi float di DataFrame

112

Cara menyembunyikan kolom DataFrame yang berisi string dan NaNnilai menjadi float. Dan ada kolom lain yang nilainya string dan float; bagaimana mengubah seluruh kolom ini menjadi float.

Neer
sumber
7
JANGAN GUNAKAN convert_objects. Itu sudah usang. Gunakan to_numericatau astypesebagai gantinya
Ted Petrou

Jawaban:

72

CATATAN: pd.convert_objects sekarang sudah tidak digunakan lagi. Anda harus menggunakan pd.Series.astype(float)atau pd.to_numericseperti yang dijelaskan dalam jawaban lain.

Ini tersedia dalam 0.11. Paksa konversi (atau set ke nan) Ini akan bekerja bahkan ketika astypeakan gagal; itu juga seri demi seri sehingga tidak akan mengubah katakanlah kolom string lengkap

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo'])))

In [11]: df
Out[11]: 
     A    B
0  1.0  1.0
1    1  foo

In [12]: df.dtypes
Out[12]: 
A    object
B    object
dtype: object

In [13]: df.convert_objects(convert_numeric=True)
Out[13]: 
   A   B
0  1   1
1  1 NaN

In [14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]: 
A    float64
B    float64
dtype: object
Jeff
sumber
Harap perhatikan bahwa ini tidak berfungsi untuk kolom (di leadt multiindex), hanya berfungsi untuk nilai di kerangka data
denfromufa
1
Saya harus menggunakan set_levels untuk mengonversi string menjadi float
denfromufa
16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Anda hanya dapat mengonversi satu kolom.
Jack
19
ini sekarang pd.to_numeric (col) di versi yang lebih baru
Jeff
11
convert_objects tidak digunakan lagi di panda yang lebih baru. Gunakan konverter khusus tipe data pd.to_numeric.
Thomas Matthew
57

Kamu bisa mencoba df.column_name = df.column_name.astype(float). Untuk NaNnilai, Anda perlu menentukan bagaimana nilai tersebut harus dikonversi, tetapi Anda dapat menggunakan .fillnametode untuk melakukannya.

Contoh:

In [12]: df
Out[12]: 
     a    b
0  0.1  0.2
1  NaN  0.3
2  0.4  0.5

In [13]: df.a.values
Out[13]: array(['0.1', nan, '0.4'], dtype=object)

In [14]: df.a = df.a.astype(float).fillna(0.0)

In [15]: df
Out[15]: 
     a    b
0  0.1  0.2
1  0.0  0.3
2  0.4  0.5

In [16]: df.a.values
Out[16]: array([ 0.1,  0. ,  0.4])
akar
sumber
47

Di versi panda yang lebih baru (0,17 dan lebih tinggi), Anda dapat menggunakan fungsi to_numeric . Ini memungkinkan Anda untuk mengonversi seluruh kerangka data atau hanya kolom individual. Ini juga memberi Anda kemampuan untuk memilih cara memperlakukan hal-hal yang tidak dapat dikonversi ke nilai numerik:

import pandas as pd
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s)
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')
pd.to_numeric(s, errors='coerce')
Salvador Dali
sumber
32
Untuk mendaftar pd.to_numericke DataFrame, seseorang dapat menggunakan df.apply(pd.to_numeric)seperti yang dijelaskan secara rinci dalam jawaban ini .
Ninjakannon
31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
Claude BISA
sumber
6
Ini tidak berfungsi saat mengonversi dari String ke Float:ValueError: could not convert string to float: 'date'
Jack
@Jack apakah Anda tahu solusi di sini? Saya mengalami masalah ini saat mengonversi string menjadi float.
Hatt
@Hatt saya menghadapi masalah yang sama. apakah Anda menemukan solusi untuk itu?
Prakhar Jhudele
@ Jack Saya tidak yakin tetapi Anda tampaknya mencampur format tanggal dan float. # convert ke datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE
8

Anda harus mengganti string kosong ('') dengan np.nan sebelum mengubahnya menjadi float. yaitu:

df['a']=df.a.replace('',np.nan).astype(float)
Paul Mwaniki
sumber
1

Berikut ini contohnya

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

tetapi jika ini semua adalah nilai string ... seperti dalam kasus saya ... Ubah kolom yang diinginkan menjadi float:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

Dataframe Anda sekarang akan memiliki nilai float :-)

ArmandduPlessis
sumber