看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 的每个列是由一个 Series 组成的,每个 Series 如果是同构的则会有一个确定的数据类型,否则可能会是一个 object 类型,表示每个值均有不同的类型。今天的我们的案例将从 pandas 的 DataFrame 的一个异构列中找出非数字行。
先构造如下测试数据:
import pandas as pd
df = pd.DataFrame({'a': [*'abcdef'],
'b': ['No', 2, -3, '-', 4.3, '20%'],
})
df
'''
a b
0 a No
1 b 2
2 c -3
3 d -
4 e 4.3
5 f 20%
'''
这个数据共两列,它们的列类型分别是:
df.dtypes
'''
a object
b object
dtype: object
'''
a 列是同构的字符串类型,b 列为异构的数据类型,显示为 object,我们观察 a 列对应的 a、d、f 行为非数字,我们的需求是将这些非数字类型的行选择出来。
选择过滤数据可以通过布尔序列来完成,类似于 df[<boolean-vectors >]
,我们只要将要选定的值位置为 True。
接下来要做的就是判断 df.b
列各值的类型。要选择非数字类型的值,可先识别数字类型,再用按位取反运算符(~
)反向选择。
通过 map 取所有的值类型:
df.b.map(type)
'''
0 <class 'str'>
1 <class 'int'>
2 <class 'int'>
3 <class 'str'>
4 <class 'float'>
5 <class 'str'>
Name: b, dtype: object
'''
这样就得到了所有值的类型,再判断类型是否属于在整型和浮点型:
df.b.map(type).isin([int, float])
'''
0 False
1 True
2 True
3 False
4 True
5 False
Name: b, dtype: bool
'''
得到布尔序列后,再进行数据过滤:
df[~df.b.map(type).isin([int, float])]
'''
a b
0 a No
3 d -
5 f 20%
'''
另外,我们可以直接使用 pandas 提供的类型判断接口进行类型检测:
df.b.map(pd.api.types.is_number)
'''
0 False
1 True
2 True
3 False
4 True
5 False
Name: b, dtype: bool
'''
df[~df.b.map(pd.api.types.is_number)]
'''
a b
0 a No
3 d -
5 f 20%
'''
这样就非常方便地过滤掉数字类型数据。
(完)
更新时间:Aug. 18, 2024, 4:07 p.m. 标签:pandas python 选择 数据类型