关于pandas:Pandas-变量类型转换的-6-种方法

47次阅读

共计 5780 个字符,预计需要花费 15 分钟才能阅读完成。

一、变量类型及转换

对于变量的数据类型而言,Pandas 除了数值型的 int 和 float 类型外,还有 object,category,bool,datetime 类型。

另外,空值类型作为一种非凡类型,须要独自解决。

数据处理的过程中,常常须要将这些类型进行相互转换,上面介绍一些变量类型转换的罕用办法。

1、查问变量类型

在数据处理的过程中,针对不同的数据类型会有不同的解决办法,比方数值型能够做加减乘除,然而字符型、工夫类型就须要其它解决办法。为此,咱们首先须要将各种数据类型进行辨别,而后再别离解决。

pandasselect_dtype 函数能够特色变量进行疾速分类,具体用法如下:

DataFrame.select_dtypes(include=None, exclude=None)

  • include:列表,想要留下的数据类型,比方 float64int64boolobject
  • exclude:列表,须要排除的数据类型,同上。
df = pd.DataFrame({'a': [1, 2] * 3,
                   'b': [True, False] * 3,
                   'c': [1.0, 2.0] * 3,
                   'd': ['a','b']*3})
# 筛选 float 和 int 的数值类型变量
num_list = df.select_dtypes(include=['float','int64']).columns.tolist()
# 筛选 ojbect 字符型的数值类型变量
obj_list = df.select_dtypes(include=['object']).columns.tolist()

print(obj_list)
print(num_list)

>> ['d']
>> ['a', 'c']

includeexclude 也能够组合应用筛选。

如果想要查看所有变量的数据类型,能够通过 info 疾速查看,如下:

df.info()
>><class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   a       6 non-null      int64  
 1   b       6 non-null      bool   
 2   c       6 non-null      float64
 3   d       6 non-null      object 
dtypes: bool(1), float64(1), int64(1), object(1)
memory usage: 278.0+ bytes

2、转换数值类型

数值类型包含 intfloat

转换数据类型比拟通用的办法能够用 astype 进行转换。

pandas中有种十分便当的办法 to_numeric() 能够将其它数据类型转换为数值类型。

pandas.to_numeric(arg, errors=’raise’, downcast=None)

  • arg:被转换的变量,格局能够是list,tuple,1-d array,Series
  • errors:转换时遇到谬误的设置,ignoreraisecoerce,上面例子中具体解说
  • downcast:转换类型降级设置,比方整型的有无符号signed/unsigned,和浮点float

上面例子中,s是一列数据,具备多种数据类型,当初想把它转换为数值类型。

import pandas as pd
import numpy as np

s = pd.Series(['boy', '1.0', '2019-01-02', 1, False, None, pd.Timestamp('2018-01-05')])

# 默认错位格局为 raise,遇到非数字字符串类型报错
pd.to_numeric(s, errors='raise') 

# 错位格局为 ignore,只对数字字符串转换, 其余类型一律漠视不转换, 蕴含工夫类型
pd.to_numeric(s, errors='ignore')

# 将工夫字符串和 bool 类型强制转换为数字, 其余均转换为 NaN
pd.to_numeric(s, errors='coerce')  

# downcast 能够进一步转化为 int 或者 float
pd.to_numeric(s) # 默认 float64 类型
pd.to_numeric(s, downcast='signed') # 转换为整型

4、转换字符类型

数字转字符类型非常简单,能够简略的应用 str 间接转换。

df = pd.DataFrame({'year': [2015, 2016],
                   'month': [2, 3],
                   'day': [4, 5]})
df['month'] = df['month'].map(str) 
df.info()
>><class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   year    2 non-null      int64 
 1   month   2 non-null      object
 2   day     2 non-null      int64 
dtypes: int64(2), object(1)
memory usage: 176.0+ bytes

此外这里再延长一下,去掉字符类型 的办法eval

比方,当咱们遇到 '[1,2,3]' 这种状况的时候,咱们理论想获取外面的列表,然而当初却是个字符串类型,咱们能够应用 eval 函数将 '' 这个外套间接去掉,去掉后主动转换成外面数据类型。

a = '[1,2,3]'
type(a) 
>> str

eval(a)
>> [1, 2, 3]

5、转换工夫类型

应用 to_datetime 函数将数据转换为日期类型,用法如下:

pandas.to_datetime(arg, errors=’raise’, dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin=’unix’)

参数比拟多,罕用的就是format,依照指定的字符串 strftime 格局解析日期,个别状况下该函数能够间接主动解析成日期类型。

# 对整个 dataframe 转换,将年月日几列主动合并为日期
df = pd.DataFrame({'year': [2015, 2016],
                   'month': [2, 3],
                   'day': [4, 5]}) 
df
>> year month day
0 2015 2 4
1 2016 3 5

pd.to_datetime(df)
>>
0   2015-02-04
1   2016-03-05
dtype: datetime64[n
s]

# 对单列转换日期类型
df1 = pd.DataFrame({'appl_tm':['20220401','20220402','20220403'],
                    'appl_tm1':['2012.03.04','2021.09.04','2031.06.05']})
>>df1
    appl_tm     appl_tm1
0 20220401 2012.03.04
1 20220402 2021.09.04
2 20220403 2031.06.05 

df1['appl_tm'] = pd.to_datetime(df1['appl_tm'])
df1['appl_tm1'] = pd.to_datetime(df1['appl_tm1'], format='%Y.%m.%d')
>>df1
    appl_tm     appl_tm1
0 2022-04-01 2012-03-04
1 2022-04-02 2021-09-04
2 2022-04-03 2031-06-05

转换为日期类型后,就能够对日期应用 series.dt. 办法进行更简单的筛选和查问了。

# 筛选 2021 年的日期,month 和 day 也是同理
df1['appl_tm1'].dt.year == 2021
>>
0    False
1     True
2    False
Name: appl_tm1, dtype: bool 

df1[df1['appl_tm1'].dt.year == 2021]
>>
    appl_tm     appl_tm1
1 2022-04-02 2021-09-04

6、转换 category 类型

category 类型在 pandas 中的出场率并不是很高,个别在不思考优化效率时,会用其它类型代替。但如果须要转换 category 类型,能够间接应用 astype 实现。

df = pd.DataFrame({'year': [2015, 2016],
                   'month': [2, 3],
                   'day': [4, 5]}) 
df['year'] = df['year'].astype('category')
df.info()
>><class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype   
---  ------  --------------  -----   
 0   year    2 non-null      category
 1   month   2 non-null      int64   
 2   day     2 non-null      int64   
dtypes: category(1), int64(2)
memory usage: 258.0 byte

对于 category 类型的具体应用办法,能够参考这篇文章:category 分类变量的应用办法

7、智能类型转换 convert_dtypes

下面介绍的均为手动一对一的变量类型转换,pandas中还提供了一种智能转换的办法convert_dtypes,应用它能够无脑主动实现转换。

默认状况下,convert_dtypes将尝试将 SeriesDataFrame中的每个 Series 转换为反对的 dtypes,它能够对 SeriesDataFrame都间接应用。

该办法的参数如下:

  • infer_objects:默认为 True,是否应将对象dtypes 转换为最佳类型
  • convert_string:默认为 True,对象dtype 是否应转换为StringDtype()
  • convert_integer:默认为True,如果可能,是否能够转换为整数扩大类型
  • convert_boolean:默认为 True,对象dtype 是否应转换为BooleanDtypes()
  • convert_floating:默认为 True,如果可能,是否能够转换为浮动扩大类型。如果convert_integer 也为 True,则如果能够将浮点数忠诚地转换为整数,则将优先思考整数dtype

上面看一组示例。

通过后果能够看到,变量都是是创立时默认的类型。但其实变量是有整数、字符串、布尔的,其中有的还存在空值。

# 对整个 dataframe 间接转换
>>> dfn = df.convert_dtypes()
>>> dfn
   a  b      c     d     e      f
0  1  x   True     h    10   <NA>
1  2  y  False     i  <NA>  100.5
2  3  z   <NA>  <NA>    20  200.0

>>> dfn.dtypes
a      Int32

b     string
c    boolean
d     string
e      Int64
f    Float64
dtype: object

疏忽了空值的影响,变量类型曾经主动转换为咱们想要的了。

Series 的转换也是一样的。上面的 Seires 中因为存在 nan 空值所以类型为object

# Series 变量类型转换
s = pd.Series(["a", "b", np.nan])

>>> s
0      a
1      b
2    NaN
dtype: object

# 通过 convert_dtypes 胜利转换为 String
>>> s.convert_dtypes()
0       a
1       b
2    <NA>
dtype: string

如果将来减少了新类型,convert_dtypes办法也会同步更新,并反对新的变量类型。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩 Python 电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

正文完
 0