python pandas数据类型转换

python pandas数据类型转换

0 背景


python pandas数据类型转换

前提到过WPS支持python: WPS支持python, 也对pandas提到了一些基础的操作, 因此, 本文依旧主要借助WPS平台对pandas的数据进行一些筛选查询操作。本篇我们主要处理pandas的数据类型转换.

Pandas DataFrame 支持多种数据类型,包括但不限于以下几种:

  1. object:一种通用的数据类型,在没有明确指定类型下,所有数据都可认为是 object 类型。它通常用于存储字符串,但也可以存储其他 Python 对象
  2. int64:64 位整数类型,用于存储整数。
  3. float64:64 位浮点数类型,用于存储带有小数点的数值。
  4. bool:布尔类型,用于存储 True 或 False 值。
  5. datetime64:日期时间数据类型,用于存储日期和时间数据。Pandas 提供了丰富的日期时间处理功能。
  6. timedelta64:时间差数据类型,用于表示两个日期或时间之间的差异。
  7. category:分类数据类型,用于存储有限且固定的分类数据,可以更有效地存储和处理某些类型的数据。
  8. string(或 str):特定于 Pandas 的字符串类型,提供了许多字符串处理方法和功能。

1 使用

初始化数据

python pandas数据类型转换
image-20231226232524490

在WPS中初始化数据:

df = xl("$A$1:$G$18", headers=True, sheet_name="工作表1")
# 设置索引为uid列
df.set_index('uid',inplace=True)
print(df.head())

在python中初始化数据:

# 初始化数据
df = pd.read_csv('./工作表1.csv')
df = pd.DataFrame(data)
df.set_index('uid', inplace=True)

查看原始类型

df.dtypes
uname    object
usex     object
uage      int64
umail    object
ucity    object
udate    object
dtype: object

可以看到字段的类型, 字符串类型的都是以object类型存在, 所以我们首先将其进行类型转换.

当然, 在导入的时候, 我们也可以对字段的类型直接指定:

# 初始化数据
df = pd.read_csv('./工作表1.csv', dtype={'uname':'string','ucity':'string'})
df.set_index('uid', inplace=True)
df.dtypes
uname    string
usex     object
uage      int64
umail    object
ucity    string
udate    object
dtype: object

可以看到, uname & ucity 已经显式地进行了类型地变换, 但其他的字段仍多以objetc类型存在.

推断类型

因此, 我们可以自动地对dataframe转换类型, 以下地方法会自动推断各个字段的类型, 并返回新的推断并修改后的dataframe. 如果符合我们的预期, 我们也可以直接替换.

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

df.infer_objects().dtypes
uname    object
usex     object
uage      int64
umail    object
ucity    object
udate    object
dtype: object

不过, infer_objects 类型转换有时候对string类型支持并不是很友好, 所以更推荐使用下面这个方法, 它支持string类型的转换.

# 自动转换合适的数据类型, 支持String类型
df.convert_dtypes()

df.convert_dtypes().dtypes
uname    string
usex     string
uage      Int64
umail    string
ucity    string
udate    string
dtype: object

可以看到, string类型也被顺利地转换过来.

指定类型

在一些情况下, 我们也可以手动地将字段地类型转换成我们需要的类别, 比如, 上面的 convert_dtypes() 在调用之后, udate 字段并未自动转换为日期类型.

因此, 我们还需将其手动进行转换.

pd.to_datetime(df['udate'])
uid
1    2001-11-13
...
16   2020-01-13
17   2008-03-24
Name: udate, dtype: datetime64[ns]

可以看到, udate 的数据类型被转换成datetime64日期类型了.

当然, 我们也可以进行一些其他的类型转换.

# 转换成数字
lis = pd.Series(['1'23])
pd.to_numeric(lis)

# 0    1
# 1    2
# 2    3
# dtype: int64
lis = pd.Series(['1'23'a'])
pd.to_numeric(lis, errors='coerce')

# 0    1.0
# 1    2.0
# 2    3.0
# 3    NaN
# dtype: float64
lis = pd.Series(['1'23,'a'])
pd.to_numeric(lis, errors='ignore')

# 0    1
# 1    2
# 2    3
# 3    a
# dtype: object

其中, 我们指定了errors参数, 可以有以下选择:

  1. 'raise':默认值。如果遇到无法转换为数字的数据,将引发异常。
  2. 'coerce':如果遇到无法转换为数字的数据,可以将其设置为 NaN(对于浮点数)或 NaN / 某个不适合的整数值(对于整数,取决于是否存在适合的 NaN 表示)。这通常用于在数据清洗时保留那些“接近”数字格式的数据,同时标记出无法转换的条目。在上面的类型转换中, 数字型元素被转换为数字类型, 不可转换为数字的自动设置为NaN了.
  3. 'ignore':如果遇到无法转换为数字的数据,将保持原样不变。这意味着函数将尝试对序列中的每个元素执行转换,但如果转换失败,它将不会更改该元素的值或引发异常。请注意,'ignore' 实际上并不会改变非数字元素的数据类型;它只是确保转换过程不会因这些元素而中断。在上面的转换中, 类型没有转换成功, 仍然以object类型存在.

astype()

astype() 函数是pandas中很常见也是最通用的数据类型转换方法,正常来说, 我们可以直接使用这个函数进行我们的类型转换.

df['ucity'].astype('string').dtypes
# string[python]

df['udate'].astype('datetime64').dtypes
df['udate'].astype('datetime64[ns]').dtypes
# dtype('<M8[ns]')

df['uname'].astype('object').dtypes
# dtype('O')

pd.Series(['1'23]).astype('float').dtypes
# dtype('float64')

在一些场景下, 我们可能会遇到复杂的数据类型需要处理, 比如13.14%, 16,453, $78 这类数据, 我们在处理的时候通常需要将这些转换为数字格式:

lis = pd.Series(['67.89%''67.99%''21.95%'])
lis.str.replace('%''').astype('float') / 100
# or
lis.apply(lambda x: x.replace('%','')).astype('float') / 100

# 0    0.6789
# 1    0.6799
# 2    0.2195
# dtype: float64

2 关于

欢迎关注我的微信公众号


原文始发于微信公众号(其之):python pandas数据类型转换

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204802.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!