pandas 筛选列表中至少包含一个值的DataFrame行

xkrw2x1b  于 2023-01-07  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个pandas Dataframe ,结构如下:

ID                                            Class
0  2431214                                   16,41,9
1  2497796                   14,16,18,20,24,35,41,42
2  1407550          20,21,24,25,26,27,28,3,34,35,4,8
3   472723                                   1,17,22
4   423046                     28,30,32,34,39,4,42,8

Class是一个字符串属性。我想过滤Class至少包含给定列表中一个元素的行,例如,如果我的过滤器是l = [16, 27],我应该得到以下内容:

ID                                            Class
0  2431214                                   16,41,9
1  2497796                   14,16,18,20,24,35,41,42
2  1407550          20,21,24,25,26,27,28,3,34,35,4,8

我所寻找的行为类似于SQL的IN语句,它工作正常,但是pandas 'isin不适合我(它只返回一个过滤器类的条目):
一个二个一个一个
如何筛选DataFrame,以便返回具有至少一个满足筛选条件的值的条目?

dgsult0t

dgsult0t1#

当你有字符串时,最佳的可能是使用一个有单词边界的正则表达式:

pattern = '|'.join(map(str, l))

out = df[df['Class'].str.contains(fr'\b(?:{pattern})\b')]

输出:

ID                             Class
0  2431214                           16,41,9
1  2497796           14,16,18,20,24,35,41,42
2  1407550  20,21,24,25,26,27,28,3,34,35,4,8

如果要了解检测到的值:

# first match
df['Class'].str.extract(fr'\b({pattern})\b', expand=False)
# all matches
df['Class'].str.extractall(fr'\b({pattern})\b')[0].groupby(level=0).agg(','.join)

相关问题