在 Pandas 中更改列的数据类型

import pandas as pd
import numpy as np
a = [[‘a‘, ‘1.2‘, ‘4.2‘], [‘b‘, ‘70‘, ‘0.03‘], [‘x‘, ‘5‘, ‘0‘]]
df = pd.DataFrame(a)
df.dtypes
0    object
1    object
2    object
dtype: object

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

1 创建 DataFrame 时指定类型

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

 df = pd.DataFrame(data=np.arange(100).reshape((10,10)), dtype=np.int8)
df.dtypes
0    int8
1    int8
2    int8
3    int8
4    int8
5    int8
6    int8
7    int8
8    int8
9    int8
dtype: object

2 对于 Series

s = pd.Series([‘1‘, ‘2‘, ‘4.7‘, ‘pandas‘, ‘10‘])
s
0         1
1         2
2       4.7
3    pandas
4        10
dtype: 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)

<ipython-input-24-12f1203e2645> in <module>()
----> 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.0
1     2.0
2     4.7
3     NaN
4    10.0
dtype: float64

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

pd.to_numeric(s, errors=‘ignore‘)
0         1
1         2
2       4.7
3    pandas
4        10
dtype: 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

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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     object
col2    float64
col3    float64
dtype: 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    object
b    object
dtype: object

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

df = df.infer_objects()
df.dtypes
a     int64
b    object
dtype: 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      object
two      object
three    object
dtype: object
df[[‘two‘, ‘three‘]] = df[[‘two‘, ‘three‘]].astype(float)
df.dtypes
one       object
two      float64
three    float64
dtype: object

原文地址:https://www.cnblogs.com/q735613050/p/9130312.html

时间: 2024-10-30 10:02:02

在 Pandas 中更改列的数据类型的相关文章

在Pandas中更改列的数据类型【方法总结】

先看一个非常简单的例子: a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']] df = pd.DataFrame(a) 有什么方法可以将列转换为适当的类型?例如,上面的例子,如何将列2和3转为浮点数?有没有办法将数据转换为DataFrame格式时指定类型?或者是创建DataFrame,然后通过某种方法更改每列的类型?理想情况下,希望以动态的方式做到这一点,因为可以有数百个列,明确指定哪些列是哪种类型太麻烦.可以假定每列都

Asp.net 修改已有数据的DataTable中某列的数据类型

DataTable dt_PI = new DataTable(); //克隆表结构 dt_PI = ds.Tables[0].Clone(); dt_PI.Columns["FLTFullPercentage"].DataType = typeof(String);//修改[满柜百分比]列的数据类型 foreach (DataRow row in ds.Tables[0].Rows) { DataRow rowNew = dt_PI.NewRow(); foreach (DataCo

pandas中一列含有多种数据类型的转换:科学计算法转浮点数、字符映射

import pandas as pd import re def getNum(x): """ 科学计数法和字符转浮点数 """ if re.findall(r'\d+\.\d+E\+',x): return "%.f" % float(x) elif x=="C": return 1 else: return x df = pd.DataFrame({"x":[2030,1.1100

SQL中改变列的数据类型

一.该列非主键.无default约束 直接更新: alter table 表名 alter column 列名 数据类型 二.该列为主键列.无default约束 (1)删除主键 alter table 表名 drop constraint 主键名称 (2)更新数据类型 alter table 表名 alter column 列名 数据类型 not null (3)添加主键 alter table 表名 add constraint 主键名称 primary key (主键字段1,主键字段2) 三

sas中的sql(6)创建表格、展现表格、插入行、删除行、规定限制条件(constriants)、处理输入错误(undo策略)、update表格、更改列

1:三种建表方式 建表只会在库中建立好表格并在日志中显示,并不会有输出. 1.1:自己定义列来建立一张空表 column-specification = column-define + column-constriants + MESSAGE=/MSGTYPE SAS中数据的存储方式只有两种,一种char(n)一种num.sas也支持sql原生的数据类型,但是最终都会统一转化为这两种 proc sql; create table work.departments (Dept varchar(20

使用sql更改表的列的数据类型和添加新列和约束

使用sql更改表的列的数据类型和添加新列和约束 修改数据库表某一列或添加列 --增加一列 ALTER TABLE 表名 ADD 列名 VARCHAR(20) NULL --删除一列 ALTER TABLE 表名 drop COLUMN 列名 --修改一列 alter TABLE 表名 ALTER COLUMN 列名 VARCHAR(40) NULL --修改一列的类型 alter TABLE 表名 ALTER COLUMN 列名 VARCHAR(40)- -添加主键约束 alter table

查看oracle表中列的数据类型

一. SQLPLUS中,直接用 DESC[ribe] tablename 即可. 二.在外部应用程序调用查看ORACLE中的表结构时,只能用下面的语句代替: 1.看字段名与数据类型 select * from cols WHERE TABLE_name=upper('table_name'); --(user_tab_columns缩写cols) 2.查看全部列 select * from user_tab_columns where table_name = upper(‘tablename’

Pandas中的DataFrame按指定顺序输出所有列的方法

问题: 输出新建的DataFrame对象时,DataFrame中各列的显示顺序和DataFrame定义中的顺序不一致. 例如: import pandas as pd grades = [48,99,75,80,42,80,72,68,36,78] df = pd.DataFrame( {'ID': ["x%d" % r for r in range(10)], 'Gender' : ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],

Oracle中对列加密的方法

Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col(id int,txt varchar2(100) encrypt using '算法名称' identified by '密钥' no salt);优点:对应用完全透明缺点:需要数据库管理员管理wallet,增加了管理复杂性,也无法避免数据库管理员查看原文. 2,使用DBMS_CRYPTO包优点: