首页 - 信息 - Pandas 数据类型转换

Pandas 数据类型转换

2023-10-01 10:56

Pandas 数据类型转换

1。 Pandas 中的数据类型:

无论是Series还是DataFrame,每一列都有对应的数据类型。 Pandas 中存在以下数据类型。

Pandas dtype Python 类型 Numpy 类型 描述
物体 str或mixed(混合型) string_、unicode_、混合类型 文本是数字或非数字类型的混合
int64 int int_、int8、int16、int32、int64、uint8、uint16、uint32、uint64 整数型
float64 浮动 float_、float16、float32、float64 浮点类型
布尔 布尔 布尔_ 布尔型
日期时间64 NA 日期时间 日期和时间类型
时间增量 NA NA 时差
类别 NA NA 有限的文本值列表(分类)

案例数据文件:

这里我们以sales_data_types.csv文件为例。我们来解释一下以下知识点。读取代码如下:

导入 pandas 作为 pd将 numpy 导入为 np

df = www.gsm-guard.net_csv(“数据/sales_data_types.csv”)
df.head()

输出结果为:

数据类型相关操作:

1。查看DataFrame中所有列的类型:

您可以通过df.dtypeswww.gsm-guard.net查看df对象的类型。输入df.dtypes输出结果如下:

客户编号 float64
客户名称对象
2016年对象
2017年对象
增长百分比对象
Jan 单位对象
月份 int64
日 int64
年 int64
活动对象
数据类型:对象

输入www.gsm-guard.net()输出结果如下:


RangeIndex:5 个条目,0 到 4
数据列(共10列):
 # 列非空计数 Dtype
--- ------ -------------- -----
 0 客户编号 5 非空 float641 客户名称 5 非空对象
 2 2016 5 个非空对象
 3 2017 5 非空对象
 4 百分比增长 5 非空对象
 5 Jan 单元 5 个非空对象
 6 月 5 非空 int64
 7 天 5 非空 int64
 8 年 5 非空 int64
 9 Active 5 非空对象
数据类型:float64(1)、int64(3)、object(6)
内存使用量:528.0+字节

2。使用astype转换类型:

使用astype可以非常方便地转换类型,例如将客户编号转换为整数:

df['客户编号'].astype('int')

上面的代码不会真正改变df['客户编号']的类型。如果你想真正改变它,你需要重新分配它:

df['客户编号'] = df['客户编号'].astype('int')

此时查看df.dtypes,可以看到数据类型发生了变化:

客户编号 int64
客户名称对象
2016年对象
2017年对象
增长百分比对象Jan 单位对象
月份 int64
日 int64
年 int64
活动对象
数据类型:对象

3。自定义转换功能:

astype 只能转换那些格式正确的数据。比如直接将df['2016']转换为浮点类型,就会报错:

df['2016'].astype('float')

将报告类似以下内容的错误:

ValueError Traceback(最近一次调用最后一次)
()
----> 1 df['2016'].astype('float')

[这里有更多代码]

ValueError:无法将字符串转换为浮点数:'$15,000.00'

这是因为2016栏中有$和逗号,直接强制转换会抛出异常。这时候就需要使用自定义的转换函数,去掉$,然后进行转换。代码如下:

def Convert_currency(val):
    ”“”
    将字符串类型转换为浮点类型
     - 删除了 $ 符号
     - 删除逗号
     - 转换为浮点类型
    ”“”
    new_val = val.replace(',','').replace('$', '')
    返回浮点数(new_val)

df['2016'].apply(convert_currency)

上面的代码也可以使用 lambda 表达式替换为 convert_currency 函数。示例代码如下:

df['2016'].apply(lambda x: x.replace('$', '').replace(',', '')).astype('float')

4。使用 np.where 更改数据类型:

例如df['Active']这一列,我们可以认为只要值为Y,那么就设置为True,否则设置为False。代码如下:

np.where(df['Active']=='Y', True, False)

5。 pandas工具功能:

www.gsm-guard.net_numeric 函数:

www.gsm-guard.net_numeric函数用于将数据转换为数字类型。其功能更加丰富。我们先看一下这个函数定义的参数:

www.gsm-guard.net_numeric(数据、错误、沮丧)
  1. data:需要类型转换的数据。
  2. 错误:发生转换错误时如何处理。有 ignoreraisecoerce可选,默认类型为raise,其中强制 表示转换为发生异常时,将使用NAN 代替。
  3. downcast:预期的转换类型。有 整数有符号无符号浮点可选,默认值为 None 。如果为None,函数会自动判断需要转换的类型。该参数设置后,可能不会根据设置的类型进行转换。比如转换的时候出现了一个NAN值,我们都知道这个NAN值是float类型。此时,如果指定为整数,则不会有任何效果。

示例代码如下:

www.gsm-guard.net_numeric(df['一月单位'], error='coerce', downcast="integer")

输出结果如下:

0 500.0
1 700.0
2 125.0
3 75.0
4 南
名称:Jan 单位,数据类型:float64

可以看到,虽然我们将类型设置为整数,但最终却是float64。原因是在转换Jan Units字段时,出现了最后一个数据NAN

如果您不希望转换失败的值是NAN,例如,您希望将其填充为0。然后你可以使用fillna来实现它。示例代码如下:

www.gsm-guard.net_numeric(df['一月单位'], 错误='强制').fillna(0)

www.gsm-guard.net_datetime 函数:

这个函数非常强大,可以将以下类型转换为datetime类型:

  1. int,浮点数时间戳类型。
  2. 字符串类型的时间格式。
  3. np.array 一维数组、列表或元组。
  4. 系列、DataFrame 或字典类型。

让我们分别解释一下。

  1. int,浮点数时间戳类型。
    您必须将单位参数指定为s,即秒。也可以指定为 ms(表示毫秒)和 ns(表示纳秒)(1 毫秒 = 10^6 纳秒)。
#整形手术
www.gsm-guard.net_datetime(1642400714,单位=“s”)
# 浮点类型
www.gsm-guard.net_datetime(1642400714.3847,单位=“s”)
# 毫秒
www.gsm-guard.net_datetime(1642400714111,单位=“s”)
  1. 字符串类型的时间格式。时间格式请参考:https://www.gsm-guard.net/3/library/datetime.html#strftime-and-strptime-behavior
#按照指定格式将字符串转换为datetime类型
www.gsm-guard.net_datetime('20220101', format='%Y%m%d')
  1. np.array 一维数组、列表或元组。
#按照原时间换算
www.gsm-guard.net_datetime([1, 2, 3], 单位='D',
              origin=pd.Timestamp('2022-01-01'))

输出结果为:

DatetimeIndex(['2022-01-02', '2022-01-03', '2022-01-04'], dtype='datetime64[ns]', freq=None)

或者直接将列表中的字符串转换为时间类型:

www.gsm-guard.net_datetime(['2018-10-26 12:00 -0530', '2018-10-26 12:00 -0500'])

输出结果为:

索引([2018-10-26 12:00:00-05:30, 2018-10-26 12:00:00-05:00], dtype='object')
  1. Series 或 DataFrame 类型。
s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
www.gsm-guard.net_datetime(s, infer_datetime_format=True)

其中infer_datetime_format表示自动推断时间格式。
输出结果为:

0 2000-03-11
1 2000-03-12
2 2000-03-13
数据类型:datetime64[ns]

放在一起:

我们可以在第一次读取文件时指定转换数据类型的工作。示例代码如下:

def Convert_percent(val):
    ”“”
    将%字符串转换为浮点类型
    - 消除 %
    - 除以 100
    ”“”
    new_val = val.replace('%', '')返回浮点数(new_val)/ 100

df_2 = www.gsm-guard.net_csv("数据/sales_data_types.csv",
                   dtype={'客户编号': 'int'},
                   转换器={'2016':convert_currency,
                               '2017':转换货币,
                               “增长百分比”:convert_percent,
                               'Jan 单位': lambda x: www.gsm-guard.net_numeric(x, error='coerce'),
                               '活动': lambda x: np.where(x == "Y", True, False)
                              })