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中初始化数据:
查看原始类型¶
可以看到字段的类型, 字符串类型的都是以object类型存在, 所以我们首先将其进行类型转换.
当然, 在导入的时候, 我们也可以对字段的类型直接指定:
# 初始化数据
df = pd.read_csv('./工作表1.csv', dtype={'uname':'string','ucity':'string'})
df.set_index('uid', inplace=True)
df.dtypes
可以看到, uname & ucity 已经显式地进行了类型地变换, 但其他的字段仍多以objetc类型存在.
推断类型¶
因此, 我们可以自动地对dataframe转换类型, 以下地方法会自动推断各个字段的类型, 并返回新的推断并修改后的dataframe. 如果符合我们的预期, 我们也可以直接替换.
不过, infer_objects 类型转换有时候对string类型支持并不是很友好, 所以更推荐使用下面这个方法, 它支持string类型的转换.
可以看到, string类型也被顺利地转换过来.
指定类型¶
在一些情况下, 我们也可以手动地将字段地类型转换成我们需要的类别, 比如, 上面的 convert_dtypes() 在调用之后, udate 字段并未自动转换为日期类型.
因此, 我们还需将其手动进行转换.
可以看到, udate 的数据类型被转换成datetime64日期类型了.
当然, 我们也可以进行一些其他的类型转换.
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 关于¶
欢迎关注我的微信公众号¶