看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,你可以使用集合(set)的交集操作来计算两个集合是否有交集。集合的交集操作会返回一个新的集合,其中包含了两个原始集合中共同存在的元素。如果交集非空,则说明两个集合有交集,否则它们没有交集。我们来看看,结合 pandas 如何来实现字符串是否包含查询。
我们构造一个 DataFrame 如下:
import pandas as pd
import io
data = '''
y
aa
bc,c
d,ef,f
a,bd,cd
ef,f
bd
cd,d
ff
a,bd,c,d
ec,f
'''
selects = ['bd', 'cd']
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
有一个 y 列,这个列里的数据为用逗号分隔的字符串,我们另外还有一个列表:
selects = ['bd', 'cd']
我们需要查询出 df 中包含 selects 元素的数据行。
我们有两种办法来解决这个问题:
isdisjoint()
方法判断是否没有交集,从而得到一个布尔序列,再用这个布尔序列来选择数据。isin()
来判断当前字符串是否在 selects 中,得到一个布尔 Series,然后选择为 True 的值,获取它的索引值,就是我们要选择的数据。此时由于爆炸千万重复的索引,我们可以用索引对象的 unique()
方法去除重复。最后再用 iloc[]
传入这个布尔序列选择到最终的数据。第一个思路的代码是:
df[
~df.y.str.split(',')
.map(lambda x: set(x).isdisjoint(set(selects)) )
]
'''
y
3 a,bd,cd
5 bd
6 cd,d
8 a,bd,c,d
'''
第二个思路是:
index = (
df.y.str.split(',')
.explode()
.isin(selects)
.loc[lambda x: x]
.index
.unique()
)
# Index([3, 5, 6, 8], dtype='int64')
df.iloc[index]
'''
y
3 a,bd,cd
5 bd
6 cd,d
8 a,bd,c,d
'''
当然,这里还有一个不严谨的实现版本,也可以快速实现:
# 不严谨版
df[df.y.str.contains(f'{"|".join(selects)}')]
这样就得到了最终的结果。
(完)
更新时间:Aug. 18, 2024, 4:22 p.m. 标签:pandas python 字符 包含