我在Jupyter笔记本上运行了以下代码,但对类似的Pandas代码更快感到失望。希望有人能在Polars中展示更聪明的方法。
极地版本
def cleanse_text(sentence):
RIGHT_QUOTE = r"(\u2019)"
sentence = re.sub(RIGHT_QUOTE, "'", sentence)
sentence = re.sub(r" +", " ", sentence)
return sentence.strip()
df = df.with_columns(pl.col("text").apply(lambda x: cleanse_text(x)).keep_name())
Pandas版
def cleanse_text(sentence):
RIGHT_QUOTE = r"(\u2019)"
sentence = re.sub(RIGHT_QUOTE, "'", sentence)
sentence = re.sub(r" +", " ", sentence)
return sentence.strip()
df["text"] = df["text"].apply(lambda x: cleanse_text(x))
当我在一个有750,000行文本的 Dataframe 上运行这个程序时,上面的Pandas版本比Polars版本快10%。
1条答案
按热度按时间ggazkfy81#
在这种情况下,您可以将
Series.apply
与re.sub
合并,而不是将Series.str.replace
的2个示例链接起来,最后添加Series.str.strip
。这样通常会更快(请参阅答案末尾的原因),但对于polars
尤其如此。Pandas版
极地版本
性能比较
每种方法的
timeit
检测结果(检查dfs
是否相等):如您所见,
pandas
和polars
的两种新方法都比原始方法快,polars
方法明显赢家,仅占新pandas
方法的13.8%。那么,为什么
Series.str.replace
(或:str.strip
)比Series.apply
快得多?原因是前者一次对整个Series(例如“列”)执行一个运算符(“向量化”),而后者分别为Series中的每个元素调用Python函数。例如lambda x: cleanse_text(x)
表示:将UDF
(用户定义函数)应用于列中的第一个元素,列中的第二个元素,等等。在较大的集合中,这将产生巨大的差异。也可参考documentation的pl.DataFrame.apply
。