改变 dtypes
astype()
方法更改 Series 的 dtype 并返回一个新 Series。
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0],
'C': ['1.1.2010', '2.1.2011', '3.1.2011'],
'D': ['1 days', '2 days', '3 days'],
'E': ['1', '2', '3']})
In [2]: df
Out[2]:
A B C D E
0 1 1.0 1.1.2010 1 days 1
1 2 2.0 2.1.2011 2 days 2
2 3 3.0 3.1.2011 3 days 3
In [3]: df.dtypes
Out[3]:
A int64
B float64
C object
D object
E object
dtype: object
将列 A 的类型更改为 float,将列 B 的类型更改为整数:
In [4]: df['A'].astype('float')
Out[4]:
0 1.0
1 2.0
2 3.0
Name: A, dtype: float64
In [5]: df['B'].astype('int')
Out[5]:
0 1
1 2
2 3
Name: B, dtype: int32
astype()
方法用于特定类型转换(即你可以指定 .astype(float64')
,.astype(float32)
或 .astype(float16)
)。对于一般转换,你可以使用 pd.to_numeric
,pd.to_datetime
和 pd.to_timedelta
。
将类型更改为数字
pd.to_numeric
将值更改为数字类型。
In [6]: pd.to_numeric(df['E'])
Out[6]:
0 1
1 2
2 3
Name: E, dtype: int64
默认情况下,如果输入无法转换为数字,则 pd.to_numeric
会引发错误。你可以使用 errors
参数更改该行为。
# Ignore the error, return the original input if it cannot be converted
In [7]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='ignore')
Out[7]:
0 1
1 2
2 a
dtype: object
# Return NaN when the input cannot be converted to a number
In [8]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='coerce')
Out[8]:
0 1.0
1 2.0
2 NaN
dtype: float64
如果需要检查输入的所有行都无法转换为数字使用 boolean indexing
与 isnull
:
In [9]: df = pd.DataFrame({'A': [1, 'x', 'z'],
'B': [1.0, 2.0, 3.0],
'C': [True, False, True]})
In [10]: pd.to_numeric(df.A, errors='coerce').isnull()
Out[10]:
0 False
1 True
2 True
Name: A, dtype: bool
In [11]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[11]:
A B C
1 x 2.0 False
2 z 3.0 True
将类型更改为 datetime
In [12]: pd.to_datetime(df['C'])
Out[12]:
0 2010-01-01
1 2011-02-01
2 2011-03-01
Name: C, dtype: datetime64[ns]
请注意,2.1.2011 将转换为 2011 年 2 月 1 日。如果你想要 2011 年 1 月 2 日,则需要使用 dayfirst
参数。
In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')
将类型更改为 timedelta
In [14]: pd.to_timedelta(df['D'])
Out[14]:
0 1 days
1 2 days
2 3 days
Name: D, dtype: timedelta64[ns]