如何在Pandas Series中统计长度大于1的全大写单词数量
解决方法:向量化统计Pandas Series中符合条件的单词数量
嘿,这个需求用Pandas的内置工具就能轻松搞定,完全不用写显式的Python循环~我给你几种不同的实现方式,按需选择:
方法一:贴合你现有逻辑的向量化实现
这个方法完全基于Pandas的向量化操作,没有显式循环,完美对应你单个字符串的处理逻辑:
import pandas as pd s = pd.Series(['I AM MAD!', 'Today is a nice day', 'This restaurant SUCKS']) # 1. 将每个字符串拆分为单词列表 split_series = s.str.split() # 2. 把列表展开为每行一个单词,保留原索引(关联回原始字符串) exploded_words = split_series.explode() # 3. 筛选出长度>1的单词,再判断是否全大写 valid_words = exploded_words[exploded_words.str.len() > 1] is_uppercase = valid_words.str.isupper() # 4. 按原索引分组求和,得到每个原始字符串的符合条件单词数 result = is_uppercase.groupby(level=0).sum().fillna(0).astype(int) print(result) # 输出: # 0 2 # 1 0 # 2 1 # dtype: int64
原理说明:
explode()把每个字符串的单词列表拆成独立行,同时保留原Series的索引,这样后续分组时能精准对应回每个原始字符串。- 最后用
fillna(0)处理没有符合条件单词的条目,确保结果统一为整数类型。
方法二:简洁的apply实现(推荐)
如果你追求代码简洁,且不介意Pandas内部优化过的逐元素处理(比手动写for循环快得多),可以直接把你单个字符串的逻辑用apply推广到整个Series:
result = s.str.split().apply(lambda x: sum(word.isupper() for word in x if len(word) > 1))
这个代码和你单个字符串的处理逻辑几乎完全一致,只是用apply把逻辑批量应用到Series的每个元素上,可读性拉满,运行效率也足够应对大部分场景。
方法三:正则表达式一步到位
如果你的场景可以用正则精准匹配符合条件的单词(匹配长度≥2且所有字母为大写的单词,包括带标点的情况),可以用str.findall结合str.len实现:
# 正则解释: # \b 匹配单词边界 # [A-Z]{2,} 匹配至少两个大写字母 # [^a-z\s]* 匹配任意非小写字母、非空白字符(允许带标点) # 整体匹配长度≥2的全大写单词(含标点) result = s.str.findall(r'\b[A-Z]{2,}[^a-z\s]*\b').str.len()
这个方法完全向量化,速度最快,适合处理大规模数据。需要注意的是,正则需要根据你的实际字符串格式调整,确保匹配逻辑和word.isupper()一致。
内容的提问来源于stack exchange,提问作者kcm2174
相关产品推荐
相关产品推荐

