性能调优:DataFrame中字符串字符与词数统计
优化DataFrame文本列的字符数和词数统计性能
嘿,我太懂你这个痛点了——用apply逐行处理大数据量的DataFrame时,速度真的会慢到让人着急。其实你完全不需要用np.where(它主要是用来做条件分支判断的,和咱们的统计需求不匹配),pandas本身就有矢量化的字符串处理方法,比apply快得多,咱们直接用这个来优化就行!
问题分析
你原来的代码用了两次apply,本质上是在逐行遍历每个单元格,这种循环操作在数据量大的时候效率极低。而pandas的str访问器提供了一系列矢量化的字符串函数,能一次性处理整列数据,性能提升非常明显。
优化后的代码
import pandas as pd d = {'free text': ["merry had a little lamb", "Little Jonathan found a chicken"]} df = pd.DataFrame(data=d) # 优化字符数统计:用矢量化的str.len()替代apply df['Chars'] = df['free text'].str.len() # 优化词数统计:先矢量化拆分字符串,再统计长度 df['Words'] = df['free text'].str.split().str.len()
为什么这更快?
str.len():直接对整列的字符串进行矢量化长度计算,不需要逐行调用len()函数str.split().str.len():先一次性把整列的所有字符串按空格拆分(默认行为),再对每个拆分后的列表做矢量化长度统计,全程没有循环操作
性能对比(举个直观例子)
如果你的DataFrame有10万行数据,原来的apply方法可能需要几秒才能跑完,而矢量化方法只需要几十毫秒——差距真的非常大!
关于np.where的补充
顺便给你补个小知识:np.where的用法是np.where(条件, 满足条件的值, 不满足条件的值),比如你想根据字符数是否大于20给文本打标记,就可以这么用:
df['Long_Text'] = np.where(df['Chars'] > 20, 'Yes', 'No')
但咱们这次的统计需求不需要条件判断,所以完全用不上它~
内容的提问来源于stack exchange,提问作者goidelg
相关产品推荐
相关产品推荐

