博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 Pandas 中更改列的数据类型
阅读量:5035 次
发布时间:2019-06-12

本文共 3375 字,大约阅读时间需要 11 分钟。

import pandas as pdimport numpy as npa = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]df = pd.DataFrame(a)
df.dtypes
0    object1    object2    objectdtype: object

数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同。数据框的每列都有唯一的名字,在已创建的数据框上,用户可以添加计算列。

1 创建 DataFrame 时指定类型

如果要创建一个 DataFrame,可以直接通过 dtype 参数指定类型:

df = pd.DataFrame(data=np.arange(100).reshape((10,10)), dtype=np.int8) df.dtypes
0    int81    int82    int83    int84    int85    int86    int87    int88    int89    int8dtype: object

2 对于 Series

s = pd.Series(['1', '2', '4.7', 'pandas', '10'])s
0         11         22       4.73    pandas4        10dtype: object

使用 to_numeric 转为数值

默认情况下,它不能处理字母型的字符串'pandas'

pd.to_numeric(s) # or pd.to_numeric(s, errors='raise');
---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)pandas/_libs/src/inference.pyx in pandas._libs.lib.maybe_convert_numeric()ValueError: Unable to parse string "pandas"During handling of the above exception, another exception occurred:ValueError                                Traceback (most recent call last)
in
()----> 1 pd.to_numeric(s) # or pd.to_numeric(s, errors='raise');C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\pandas\core\tools\numeric.py in to_numeric(arg, errors, downcast) 131 coerce_numeric = False if errors in ('ignore', 'raise') else True 132 values = lib.maybe_convert_numeric(values, set(),--> 133 coerce_numeric=coerce_numeric) 134 135 except Exception:pandas/_libs/src/inference.pyx in pandas._libs.lib.maybe_convert_numeric()ValueError: Unable to parse string "pandas" at position 3

可以将无效值强制转换为NaN,如下所示:

pd.to_numeric(s, errors='coerce')
0     1.01     2.02     4.73     NaN4    10.0dtype: float64

如果遇到无效值,第三个选项就是忽略该操作:

pd.to_numeric(s, errors='ignore')
0         11         22       4.73    pandas4        10dtype: object

3 对于多列或者整个 DataFrame

如果想要将这个操作应用到多个列,依次处理每一列是非常繁琐的,所以可以使用 DataFrame.apply 处理每一列。

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]df = pd.DataFrame(a, columns=['col1','col2','col3'])df
col1 col2 col3
0 a 1.2 4.2
1 b 70 0.03
2 x 5 0
df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)df.dtypes
col1     objectcol2    float64col3    float64dtype: object

这里「col2」和 「col3」根据需要具有 float64 类型

df.apply(pd.to_numeric, errors='ignore')

该函数将被应用于整个DataFrame,可以转换为数字类型的列将被转换,而不能(例如,它们包含非数字字符串或日期)的列将被单独保留。

另外 pd.to_datetimepd.to_timedelta 可将数据转换为日期和时间戳。

软转换——类型自动推断

infer_objects() 方法,用于将具有对象数据类型的 DataFrame 的列转换为更具体的类型。

df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')df.dtypes
a    objectb    objectdtype: object

然后使用 infer_objects(),可以将列 'a' 的类型更改为 int64

df = df.infer_objects()df.dtypes
a     int64b    objectdtype: object

astype 强制转换

如果试图强制将两列转换为整数类型,可以使用 df.astype(int)

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]df = pd.DataFrame(a, columns=['one', 'two', 'three'])df.dtypes
one      objecttwo      objectthree    objectdtype: object
df[['two', 'three']] = df[['two', 'three']].astype(float)df.dtypes
one       objecttwo      float64three    float64dtype: object

转载于:https://www.cnblogs.com/q735613050/p/9130312.html

你可能感兴趣的文章
《架构之美》阅读笔记05
查看>>
《大道至简》读后感——论沟通的重要性
查看>>
JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
查看>>
关于React中props与state的一知半解
查看>>
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
阿里市值超越亚马逊 马云开启下半场技术理想
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>