python pandas数据类型转换
0 背景
之前提到过WPS支持python: WPS支持python, 也对pandas
提到了一些基础的操作, 因此, 本文依旧主要借助WPS平台对pandas的数据进行一些筛选查询操作。本篇我们主要处理pandas
的数据类型转换.
Pandas DataFrame 支持多种数据类型,包括但不限于以下几种:
-
object
:一种通用的数据类型,在没有明确指定类型下,所有数据都可认为是 object 类型。它通常用于存储字符串,但也可以存储其他 Python 对象。 -
int64
:64 位整数类型,用于存储整数。 -
float64
:64 位浮点数类型,用于存储带有小数点的数值。 -
bool
:布尔类型,用于存储 True 或 False 值。 -
datetime64
:日期时间数据类型,用于存储日期和时间数据。Pandas 提供了丰富的日期时间处理功能。 -
timedelta64
:时间差数据类型,用于表示两个日期或时间之间的差异。 -
category
:分类数据类型,用于存储有限且固定的分类数据,可以更有效地存储和处理某些类型的数据。 -
string
(或str
):特定于 Pandas 的字符串类型,提供了许多字符串处理方法和功能。
1 使用
初始化数据
在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', 2, 3])
pd.to_numeric(lis)
# 0 1
# 1 2
# 2 3
# dtype: int64
lis = pd.Series(['1', 2, 3, 'a'])
pd.to_numeric(lis, errors='coerce')
# 0 1.0
# 1 2.0
# 2 3.0
# 3 NaN
# dtype: float64
lis = pd.Series(['1', 2, 3,'a'])
pd.to_numeric(lis, errors='ignore')
# 0 1
# 1 2
# 2 3
# 3 a
# dtype: object
其中, 我们指定了errors
参数, 可以有以下选择:
-
'raise'
:默认值。如果遇到无法转换为数字的数据,将引发异常。 -
'coerce'
:如果遇到无法转换为数字的数据,可以将其设置为NaN
(对于浮点数)或NaN
/ 某个不适合的整数值(对于整数,取决于是否存在适合的 NaN 表示)。这通常用于在数据清洗时保留那些“接近”数字格式的数据,同时标记出无法转换的条目。在上面的类型转换中, 数字型元素被转换为数字类型, 不可转换为数字的自动设置为NaN
了. -
'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', 2, 3]).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