看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 的 isin() 可以判断 DataFrame、Series 以及 索引 是否包含传入的指定值,返回的是布尔矩阵或者布尔序列,其中 True 表示包含。不同对象的传入参与和返回数据形式有所不同,我们将一一介绍。
isin() 适用的对象有:
针对 DataFrame 对象 isin() 的语法是 DataFrame.isin(values)
,它只有一个参数。返回的是一个 DataFrame,值由布尔值构成,代码指定位置的值是否与传入的内容有相等(即匹配时为 True,注:不是相同。详见参数类型的介绍)。
参数 values 的类型及匹配规则:
以下是一些示例:
df = pd.DataFrame({'num_legs': [2, 4], 'num_wings': [2, 0]},
index=['falcon', 'dog'])
df
'''
num_legs num_wings
falcon 2 2
dog 4 0
'''
当 values 是一个列表时,检查 DataFrame 中的每个值是否都出现在列表中(哪些动物有 0 或 2 条腿或翅膀):
df.isin([0, 2])
'''
num_legs num_wings
falcon True True
dog False True
'''
要检查数据帧中的 values 是否为 not,不包含,请使用 ~
运算符:
~df.isin([0, 2])
'''
num_legs num_wings
falcon False False
dog True False
'''
当 values 是 dict 时,我们可以传递值来分别检查一个列。注意:指定列(字典键名)的值必须与字典的值(列表)位置对应匹配。
df.isin({'num_wings': [0, 3]})
'''
num_legs num_wings
falcon False False
dog False True
'''
当 values 是一个 Series 或 DataFrame 时,索引和列必须匹配。请注意,“猎鹰 falcon” 并不是根据其他区域的腿数来匹配的。
other = pd.DataFrame({'num_legs': [8, 3], 'num_wings': [0, 2]},
index=['spider', 'falcon'])
other
'''
num_legs num_wings
spider 8 0
falcon 3 2
'''
df.isin(other)
'''
num_legs num_wings
falcon False True
dog False False
'''
Series 对象的语法为 Series.isin(values)
,values 值的类型是 set 或者 list-like 数据, Series 上的值只要在 values 中存在,就算匹配。不支持字符串。
它返回一个布尔序列,指示每个元素是否在值中。以下是一些案例:
s = pd.Series(['lama', 'cow', 'lama', 'beetle', 'lama',
'hippo'], name='animal')
s.isin(['cow', 'lama'])
'''
0 True
1 True
2 True
3 False
4 True
5 False
Name: animal, dtype: bool
'''
要反转布尔值,使用 ~
运算符:
~s.isin(['cow', 'lama'])
'''
0 False
1 False
2 False
3 True
4 False
5 True
Name: animal, dtype: bool
'''
将单个字符串作为 s.isin('lama')
传递将引发错误。需要改为使用列表:
s.isin(['lama'])
'''
0 True
1 False
2 True
3 False
4 True
5 False
Name: animal, dtype: bool
'''
字符串和整数类型是不同的,因此不具有可比性:
>>> pd.Series([1]).isin(['1'])
0 False
dtype: bool
pd.Series([1.1]).isin(['1.1'])
'''
0 False
dtype: bool
'''
索引对象方法的语法是 Index.isin(values, level=None)
,它包括两个参数:
在使用多层索引 MultiIndex 的情况下,必须将值指定为类似列表的对象,该对象包含长度与级别数相同的元组,或者指定级别。否则将引发一个ValueError。
如果指定了 level:
以下是一些示例:
idx = pd.Index([1,2,3])
idx
# Int64Index([1, 2, 3], dtype='int64')
检查每个索引值是否在值列表中:
idx.isin([1, 4])
# array([True, False, False])
检查多重索引的 “color” 级别中的字符串是否在颜色列表中。
midx = pd.MultiIndex.from_arrays([[1,2,3],
['red', 'blue', 'green']],
names=('number', 'color'))
midx
'''
MultiIndex([(1, 'red'),
(2, 'blue'),
(3, 'green')],
names=['number', 'color'])
'''
midx.isin(['red', 'orange', 'yellow'], level='color')
# array([True, False, False])
要跨多索引的级别进行检查,请传递元组列表:
midx.isin([(1, 'red'), (3, 'red')])
# array([True, False, False])
对于 DatetimeIndex,values 中的字符串值将转换为时间戳匹配:
dates = ['2000-03-11', '2000-03-12', '2000-03-13']
dti = pd.to_datetime(dates)
dti
'''
DatetimeIndex(['2000-03-11', '2000-03-12', '2000-03-13'],
dtype='datetime64[ns]', freq=None)
'''
dti.isin(['2000-03-11'])
# array([True, False, False])
更新时间:2022-03-21 12:11:44 标签:pandas isin 包含