You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:38:13