繁体   English   中英

用列表中的至少一个值过滤 DataFrame 行

[英]Filter DataFrame rows with at least one value in list

我有一个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对我不起作用(它返回的条目只有一个过滤器类):

l = [16, 27]
filtered = df.loc[df['Class'].isin(l)]
ID               Class
210   30359        16
945   46307        27
3641  81222        27
3817  77365        27
4185  89828        16

如何过滤我的 DataFrame 以便返回至少有一个值满足过滤条件的条目?

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

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

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

Output:

        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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM