วิธีการปกปิดคอลัมน์ DataFrame ที่มีสตริงและNaN
ค่าที่จะลอย และมีคอลัมน์อื่นที่มีค่าเป็นสตริงและลอย วิธีแปลงคอลัมน์ทั้งหมดนี้ให้ลอย
วิธีการปกปิดคอลัมน์ DataFrame ที่มีสตริงและNaN
ค่าที่จะลอย และมีคอลัมน์อื่นที่มีค่าเป็นสตริงและลอย วิธีแปลงคอลัมน์ทั้งหมดนี้ให้ลอย
คำตอบ:
หมายเหตุ:
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
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)
คุณสามารถแปลงเพียงคอลัมน์เดียว
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])
ในแพนด้าเวอร์ชันใหม่กว่า (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')
pd.to_numeric
กับ a DataFrame
สามารถใช้df.apply(pd.to_numeric)
ตามที่อธิบายโดยละเอียดในคำตอบนี้
df['MyColumnName'] = df['MyColumnName'].astype('float64')
ValueError: could not convert string to float: 'date'
คุณต้องแทนที่สตริงว่าง ('') ด้วย np.nan ก่อนที่จะแปลงเป็น float เช่น:
df['a']=df.a.replace('',np.nan).astype(float)
นี่คือตัวอย่าง
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)
ดาต้าเฟรมของคุณจะมีค่าลอย :-)
convert_objects
ไม่ได้ใช้ เลิกใช้แล้ว ใช้to_numeric
หรือastype
แทน