Python DataFrame统计指定单词出现次数:现有代码优化及视图/副本警告问题解决
解决方法:优化代码并消除警告
1. 先搞定警告问题
你碰到的警告,根源是用了链式索引(df['has_restaurants'][index])——这种写法让pandas没法确定你操作的是原DataFrame的视图还是副本,修改时容易出现不可预期的行为。
要消除警告,只需要把赋值语句改成用.loc做明确的行+列索引:
df.loc[index, 'has_restaurants'] = sum(map(lambda count : 1 if 'restaurant' in count else 0, text))
这样pandas能清晰识别你要修改原DataFrame的指定位置,警告自然就消失了。
2. 更优雅高效的实现(替代手动循环)
pandas的核心优势就是矢量化操作,完全没必要手动遍历每一行。这里有两种更简洁的写法,处理大数据集时速度比循环快得多:
方法一:用apply结合生成器表达式
这个写法和你原代码的逻辑完全一致,但更简洁清爽:
df['has_restaurants'] = df['Description'].apply( lambda x: sum(1 for word in x.split() if 'restaurant' in word) )
它会自动对每个Description字符串拆分单词,然后统计包含"restaurant"的单词数量。
方法二:正则表达式匹配(更灵活)
如果你想严格匹配相关单词(比如不想把"restaurantxyz"这类无关词算进去),可以用str.findall结合正则:
# 匹配所有包含"restaurant"的完整单词 df['has_restaurants'] = df['Description'].str.findall(r'\w*restaurant\w*').str.len()
正则\w*restaurant\w*会匹配任何以字母数字开头/结尾、中间包含"restaurant"的单词,.str.len()则会统计每个字符串中匹配到的单词总数。
为什么这些写法更好?
- 没有冗余的手动循环,代码更简洁易读;
- 利用pandas内部优化,处理大DataFrame时速度远快于手动遍历;
- 从根源避免了链式索引的问题,不会触发警告。
内容的提问来源于stack exchange,提问作者Dvir Iluz
相关产品推荐
相关产品推荐

