pandas(8):数据类型转换


  不同的数据类型可以用不同的处理方法。合适的数据类型,才能更高效处理数据。一个列只能有一个总数据类型,但具体值可以是不同的数据类型。源Excel文件pandas_dtypes.csv:
image

df = pd.read_csv(r"pandas_dtypes.csv")
df
df.dtypes
# Customer Number 列是float64,然而应该是int64
# 2016 2017两列的数据是object,并不是float64或者int64格式
# Percent以及Jan Units 也是objects而不是数字格式
# Month,Day以及Year应该转化为datetime64[ns]格式
# Active 列应该是布尔值

image
image

# 求2016和2017数据总和,两列的数据类型为object,相加后不是想要的结果,而是得到一个更长的字符串
df['2016']+df['2017']

image

一、pandas、python、numpy数据类型对应关系

image

二、导入初始化指定

# 一次性指定所有列为object
df = pd.read_csv(r"pandas_dtypes.csv",dtype='object')
# 每个字段分别指定
df = pd.read_csv(r"pandas_dtypes.csv",dtype# ={'Customer Number': 'int64','Year':'int32'})

  有些字段导入时无法指定想要的数据,比如无法将’2016‘和’2017‘这两列字符型数据直接指定为数值型数据,必须经过一定的加工处理后才可以转换(把$符号去掉)。
  默认的数据类型是 int64 和 float64,文字类型是 object。

三、pandas智能推断

  再导入时,假若未指定数据类型,pandas会根据数据情况选择合适的默认数据类型,避免数据发生缺失。导入后,也可以通过一些函数,智能推断。

# 自动转换合适的数据类型
df.convert_dtypes()
df.infer_objects()

四、常见方法——类型转换 astype()

# 想要真正改变原始数据框,通常需要通过赋值来进行
df['Customer Number'] = df['Customer Number'].astype('int')

  像2016,2017 Percent Growth,Jan Units 这几列带有特殊符号的object是不能直接通过astype('flaot')方法进行转化的。这与python中的字符串转化为浮点数,都要求原始的字符都只能含有数字本身,不能含有其他的特殊字符。

# 将Active列转化为布尔值,五个结果全是True,不是想要的结果
df['Active'].astype('bool')

image

# 2016列中含有特殊字符$,无法直接转换,直接报错
df['2016'].astype('float')

image
astype()总结:

  • 如果数据是纯净的数据,可以转化为数字
  • astype基本也就是两种用作,数字转化为单纯字符串,单纯数字的字符串转化为数字,含有其他的非数字的字符串是不能通过astype进行转化的。
  • 需要引入其他的方法进行转化,自定义函数方法

五、通过创建自定义的函数进行数据转化

①apply()应用自定义函数

# 通过replace函数将$去掉,然后字符串转化为浮点数,让pandas选择pandas认为合适的特定类型,float或者int,该例子中将数据转化为了float64
# 通过pandas中的apply函数将2016列中的数据全部转化
def convert_currency(var):
    '''
    convert the string number to a float
    - 去除$
    - 转化为浮点数类型
    '''
    new_value = var.replace('$','')
    return float(new_value)
    
df['2016'].apply(convert_currency)

image

②lambda函数

# 通过lambda 函数将这个比较简单的函数一行带过
df['2016'].apply(lambda x: x.replace('$','')).astype('float64')
# 同样的,利用lambda表达式将PercentGrowth进行数据清理
df['Percent Growth'].apply(lambda x: x.replace('%','')).astype('float64')/100

image
image

③简单内置函数

# 利用np.where() function 将Active 列转化为布尔值
df['Active'] = np.where(df['Active']=='Y', True, False)

image

六、pandas提供的转换函数pd.to_numeric/pd.to_datatime

①pd.to_numeric()

pd.to_numeric()官方文档

pd.to_numeric(arg,errors = 'raise',downcast = None)

功能:将arg转换为数字类型,默认返回dtype为float64或int64。
参数说明:

  • arg:标量,列表,元组,一维数组或系列。
  • errors :{'ignore','raise','coerce'},默认为'raise'
    “ raise”,则无效的解析将引发异常。
    “coerce”,则无效解析将设置为NaN。
    “ ignore”,则无效的解析将返回输入
  • downcast {'integer','signed','unsigned','float'},默认值none。控制返回的dtype。
# pd.to_numeric()处理Jan Units中的数据
# 无效解析设置为NaN值,fillna()将NaN用0填充
pd.to_numeric(df['Jan Units'],errors='coerce').fillna(0)

image

②pd.to_datetime()

和时间序列数据有关:pd.to_datetime()官方文档

# pd.to_datatime()将年月日进行合并
pd.to_datetime(df[['Month','Day','Year']])

image

posted @ 2021-04-24 15:48  Lu-顺  阅读(1847)  评论(0编辑  收藏  举报