切换Pandas行与字符串匹配慢

Hea*_*ing 7 python optimization numpy pandas

我基本上想学习一种基于正则表达式的条件切片切片Pandas数据帧的更快方法.例如,以下df(string_column中有4个以上的变体,它们仅用于说明目的):

index, string_col1, string_col2, value
0, 'apple', 'this', 10
1, 'pen', 'is', 123
2, 'pineapple', 'sparta', 20
3, 'pen pineapple apple pen', 'this', 234
4, 'apple', 'is', 212
5, 'pen', 'sparta', 50
6, 'pineapple', 'this', 69
7, 'pen pineapple apple pen', 'is',  79
8, 'apple pen', 'sparta again', 78
...
100000, 'pen pineapple apple pen', 'this is sparta', 392
Run Code Online (Sandbox Code Playgroud)

我必须使用正则表达式根据string_column进行布尔条件切片,同时在值列中找到最小值和最大值的索引,然后最终找到最小值和最大值之间的差值.我通过以下方法执行此操作,但是当我必须匹配许多不同的正则表达式模式时,它是超级缓慢的:

pat1 = re.compile('apple')
pat2 = re.compile('sparta')
mask = (df['string_col1'].str.contains(pat1)) & (df['string_col2'].str.contains(pat2))
max_idx = df[mask].idxmax()
min_idx = df[mask].idxmin()
difference = df['value'].loc[max_idx] - df['value'].loc[min_idx]
Run Code Online (Sandbox Code Playgroud)

我想要获得一个"差异"的答案,我正在将df切片太多次,但我无法弄清楚如何减少它.此外,有更快的方法来切片吗?

这是一个优化问题,因为我知道我的代码可以获得我需要的东西.任何提示将不胜感激!

den*_*ufa 1

将每个掩码传递到数据帧的下一个子集,每个新的过滤都发生在原始数据帧的较小子集上:

pat1 = re.compile('apple')
pat2 = re.compile('sparta')
mask1 = df['string_col1'].str.contains(pat1)
mask = (df[mask1]['string_col2'].str.contains(pat2))
df1=df[mask1][mask]
max_idx = df1['value'].idxmax()
min_idx = df1['value'].idxmin()
a,b=df1['value'].loc[max_idx],df1['value'].loc[min_idx]
Run Code Online (Sandbox Code Playgroud)