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

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

先看一个非常简单的例子:

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

有什么方法可以将列转换为适当的类型?例如,上面的例子,如何将列2和3转为浮点数?有没有办法将数据转换为DataFrame格式时指定类型?或者是创建DataFrame,然后通过某种方法更改每列的类型?理想情况下,希望以动态的方式做到这一点,因为可以有数百个列,明确指定哪些列是哪种类型太麻烦。可以假定每列都包含相同类型的值。

解决方法

可以用的方法简单列举如下:

对于创建DataFrame的情形

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

df = pd.DataFrame(a, dtype='float')  #示例1df = pd.DataFrame(data=d, dtype=np.int8) #示例2df = pd.read_csv("somefile.csv", dtype = {
'column_name' : str})

对于单列或者Series

下面是一个字符串Seriess的例子,它的dtype为object

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

使用to_numeric转为数值。默认情况下,它不能处理字母型的字符串'pandas':

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string

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

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

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

>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched

对于多列或者整个DataFrame

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

对于某个DataFrame:

>>> a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]>>> df = pd.DataFrame(a, columns=['col1','col2','col3'])>>> df  col1 col2  col30    a  1.2   4.21    b   70  0.032    x    5     0

然后可以写:

df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)

那么'col2'和'col3'根据需要具有float64类型。

但是,可能不知道哪些列可以可靠地转换为数字类型。在这种情况下,设置参数:

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

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

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

软转换——类型自动推断

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

例如,用两列对象类型创建一个DataFrame,其中一个保存整数,另一个保存整数的字符串:

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

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

>>> df = df.infer_objects()>>> df.dtypesa     int64b    objectdtype: object

由于'b'的值是字符串,而不是整数,因此'b'一直保留。

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'])dfOut[16]:   one  two three0   a  1.2   4.21   b   70  0.032   x    5     0df.dtypesOut[17]: one      objecttwo      objectthree    objectdf[['two', 'three']] = df[['two', 'three']].astype(float)df.dtypesOut[19]: one       objecttwo      float64three    float64转自:https://vimsky.com/article/3694.html

转载地址:http://kllum.baihongyu.com/

你可能感兴趣的文章
【刷算法】LeetCode- 两数之和
查看>>
Python 中的 10 个常见安全漏洞,以及如何避免(上)
查看>>
GMTC 大前端时代前端监控的最佳实践
查看>>
类文件结构
查看>>
[Python教程] 一只乌龟其实也很酷 (1、动起来)
查看>>
手动实现bind函数(附MDN提供的Polyfill方案解析)
查看>>
八年磨一剑,阿里云ApsaraDB for HBase2.0正式上线
查看>>
HTTP/2 技术调研和性能分析
查看>>
ES6 javascript 实用开发技巧
查看>>
如何在新版的gitbook上写自己的书
查看>>
Java知识点总结(Java容器-ArrayList)
查看>>
Shared Event-loop for Same-Origin Windows(译)
查看>>
写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
查看>>
使用stanford nlp进行依存句法分析
查看>>
JavaScript Promise查缺补漏
查看>>
你还不知“dubbo”是个什么东西吗???
查看>>
Gin实践 番外 Golang交叉编译
查看>>
【401天】跃迁之路——程序员高效学习方法论探索系列(实验阶段158-2018.03.13)...
查看>>
浅谈面试中常考的两种经典布局——圣杯与双飞翼
查看>>
「旁门右道」CURL持久连接技巧
查看>>