【发布时间】:2017-12-26 12:48:07
【问题描述】:
我基本上想学习一种更快的方法来使用基于正则表达式的条件切片来切片 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
我必须使用正则表达式根据 string_column 进行布尔条件切片,同时在 value 列中找到具有最小值和最大值的索引,然后最终找到最小值和最大值之间的差异。我通过以下方法执行此操作,但是当我必须匹配许多不同的正则表达式模式时,它非常慢:
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]
我认为要获得一个“差异”答案,我将 df 切片太多次,但我不知道如何减少它。此外,有没有更快的切片方法?
这是一个优化问题,因为我知道我的代码可以满足我的需求。任何提示将不胜感激!
【问题讨论】:
-
可以将正则表达式组合成一个正则表达式,然后掩码可能会更快。 patX=re.compile('(apple|sprata)')。这会让它更快吗?此外,在整个 DataFrame 上制作掩码以获取第一个索引可能不是最快的。
-
我需要对两个不同列的两种不同模式进行两次单独的正则表达式检查,所以我不确定将它们组合成一个正则表达式并在两列之间进行匹配是个好主意。
-
您想要字符串或值列的 idxmax 吗?您的代码在 python3 中为我崩溃,但如果我正在阅读您的代码,正确的 idxmax 只是采用“字母顺序”最大值。这真的是你想要的吗?示例输出在这里也可能很好。
-
为什么在这些检查中使用正则表达式?好像你可以使用
df['string_col1'].str.contains('apple', case=False),不是吗?似乎它比编译正则表达式模式并使用它们要快。
标签: python pandas numpy optimization