[英]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.