การแปลงสตริงเพื่อลอยใน DataFrame


113

วิธีการปกปิดคอลัมน์ DataFrame ที่มีสตริงและNaNค่าที่จะลอย และมีคอลัมน์อื่นที่มีค่าเป็นสตริงและลอย วิธีแปลงคอลัมน์ทั้งหมดนี้ให้ลอย


7
convert_objectsไม่ได้ใช้ เลิกใช้แล้ว ใช้to_numericหรือastypeแทน
Ted Petrou

คำตอบ:


72

หมายเหตุ: pd.convert_objectsตอนนี้เลิกใช้งานแล้ว คุณควรใช้pd.Series.astype(float)หรือpd.to_numericตามที่อธิบายไว้ในคำตอบอื่น ๆ

มีอยู่ใน 0.11 บังคับให้แปลง (หรือ set เป็น nan) สิ่งนี้จะทำงานได้แม้ว่าastypeจะล้มเหลวก็ตาม มันยังเรียงตามอนุกรมดังนั้นมันจะไม่แปลงว่าคอลัมน์สตริงที่สมบูรณ์

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

โปรดทราบว่าสิ่งนี้ใช้ไม่ได้กับคอลัมน์ (ที่ leadt multiindex) ใช้ได้กับค่าใน dataframe เท่านั้น
denfromufa

1
ฉันต้องใช้ set_levels เพื่อแปลงสตริงเป็น float
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)คุณสามารถแปลงเพียงคอลัมน์เดียว
แจ็ค

19
ตอนนี้เป็น pd.to_numeric (col) ในเวอร์ชันที่ใหม่กว่า
Jeff

11
Convert_objects เลิกใช้แล้วในแพนด้ารุ่นใหม่ ใช้ตัวแปลงเฉพาะชนิดข้อมูล pd.to_numeric
Thomas Matthew

58

df.column_name = df.column_name.astype(float)คุณสามารถลอง สำหรับNaNค่าต่างๆคุณต้องระบุว่าควรจะแปลงอย่างไร แต่คุณสามารถใช้.fillnaวิธีนี้ได้

ตัวอย่าง:

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])

47

ในแพนด้าเวอร์ชันใหม่กว่า (0.17 ขึ้นไป) คุณสามารถใช้ฟังก์ชันto_numeric ช่วยให้คุณสามารถแปลง dataframe ทั้งหมดหรือเพียงแต่ละคอลัมน์ นอกจากนี้ยังช่วยให้คุณสามารถเลือกวิธีจัดการกับสิ่งที่ไม่สามารถแปลงเป็นค่าตัวเลขได้:

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')

32
ในการใช้pd.to_numericกับ a DataFrameสามารถใช้df.apply(pd.to_numeric)ตามที่อธิบายโดยละเอียดในคำตอบนี้
Ninjakannon

31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 

6
สิ่งนี้ใช้ไม่ได้เมื่อแปลงจาก String เป็น Float:ValueError: could not convert string to float: 'date'
Jack

@ แจ็คคุณรู้วิธีแก้ปัญหาที่นี่หรือไม่? ฉันพบปัญหานี้แน่นอนในการแปลงสตริงเป็นลอย
Hatt

@Hatt ฉันกำลังเผชิญปัญหาเดียวกัน คุณพบวิธีแก้ปัญหาหรือไม่
Prakhar Jhudele

@ แจ็คฉันไม่แน่ใจ แต่ดูเหมือนคุณจะผสมผสานรูปแบบวันที่และการลอยตัว # convert to datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE

8

คุณต้องแทนที่สตริงว่าง ('') ด้วย np.nan ก่อนที่จะแปลงเป็น float เช่น:

df['a']=df.a.replace('',np.nan).astype(float)

1

นี่คือตัวอย่าง

                            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

แต่ถ้านี่คือค่าสตริงทั้งหมด ... เหมือนในกรณีของฉัน ... แปลงคอลัมน์ที่ต้องการเป็นลอย:

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)

ดาต้าเฟรมของคุณจะมีค่าลอย :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.