改变pandas中列的数据类型

这是系列文章,我会按照stackoverflow上pandas相关问题投票数排序进行整理学习。不学习是会变咸鱼的~

原问题:change data type of columns in pandas,如何将列的数据转为合适的类型,如将下例中数字从string类型转为float。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['aa', 'bb', 'cc'])

# df
'''
aa bb cc
0 a 1.2 4.2
1 b 70 0.03
2 x 5 0
'''

df.dtypes
'''
aa object
bb object
cc object
dtype: object
'''

1)pd.to_numeric方法

1
2
# 不改变原本的数据
df['bb'] = pd.to_numeric(df['bb'])

pd.to_numeric()方法不能对DataFrame格式的数据直接转换,所以如果有多个column需要转换,可以使用apply方法。

1
2
# apply返回处理之后的结果,并不改变原本的数据,所以需要赋值
df[['bb', 'cc']] = df[['bb', 'cc']].apply(pd.to_numeric)

pd.to_numeric(arg, errors='raise', downcast=None)的参数说明:

  • arg:list、tuple、一维数组、Series
  • errors:{‘ignore’, ‘raise’, ‘coerce’},默认是raise,有错误直接抛出。ignore将返回不能被转换的原始数据;coerce将不能被转换为数字类型的数据设置为NaN
  • downcast:{‘integer’, ‘signed’, ‘unsigned’, ‘float’} , 默认是none。如果设置了某一类型的数据,那么pandas会将原始数据转为能存储的最小子型态。如float的子型态有float16,float32,float64,所以设置了downcast=float,则会将数据转为能够以较少bytes去存储一个浮点数的float16。另外,downcast参数和errors参数是分开的,如果downcast过程中出错,即使errors设置为ignore也会抛出异常。

关于downcast参数用法,例子如下:

1
2
3
4
5
6
7
8
9
# 这个例子是用concat方法将处理之后float类型数据块和非float类型的数据块合并
# 也就是只对data中float类型的数据进行处理
data = pd.concat( [
data.select_dtypes( include=['float'] )
.apply( pd.to_numeric, downcast='float' ), # apply中接收downcast参数传递给to_numeric
data.select_dtypes( exclude=['float'] )
],
axis=1
)

2)astype()方法

astype是pandas对象的方法,可以将DataFrame和Series转为指定的类型。

1
2
3
4
5
6
7
8
9
10
11
# 以下例子不以上面数据为例
# 将全部的列都转为int
df = df.astype(int)
# 将不同类型的列用字典分别设置
df = df.astype({'a': int, 'b': complex})
# 转换Series的类型
s = s.astype(np.float16)
# 转换Series为python string类型
s = s.astype(str)
# 转换Series为序列类型
s = s.astype('category')

astype也会转换出错:s.astype(np.unit8)

3)infer_objects()方法

该方法不接受任何参数,尝试将object类型的数据转为更合适的格式。不能被转换的数据则保持原样。

1
2
3
4
5
6
7
8
9
df = df.infer_objects()
# 只成功修改了bb列
df.dtypes
'''
aa object
bb float64
cc object
dtype: object
'''