正则表达式排查:统计DataFrame中符合条件的name列条目数异常
解决NASA数据集名字统计问题的正确姿势
首先得指出你原代码里的两个关键问题:
- 你把整个
name列(pandas Series)直接转成了字符串,这会让正则去匹配类似"0 ALLENDE\n1 BACHELDER\n..."这样包含索引、换行的大文本,而不是每个独立的名字,结果自然不对。 - 你的正则
[aeiouAEIOU]\w{5,}匹配的是文本中任意位置的元音开头+5个以上字符的片段,而不是整个名字以元音开头且总长度超过5个字母。比如名字"XYZApple"里的"Apple"会被匹配,但这显然不符合你的需求。
下面是修正后的完整代码,用pandas原生的字符串处理能力,高效又准确:
import re import pandas as pd # 原代码漏掉了pandas导入,必须加上 # 读取NASA数据集 url = "https://data.nasa.gov/resource/y77d-th95.json" df = pd.read_json(url, orient='columns') name_series = df["name"] # 筛选符合条件的名字:以元音开头(不区分大小写)、长度超过5个字母 # 正则解释: # ^ 匹配名字开头,确保第一个字符是元音 # [aeiou] 匹配任意元音,flags=re.IGNORECASE 自动兼容大小写 # .{5,} 匹配至少5个任意字符,加上开头的元音,总长度≥6(即超过5) # $ 匹配名字结尾,确保整个名字都符合规则 valid_names = name_series.str.match(r'^[aeiou].{5,}$', flags=re.IGNORECASE) # 统计数量 count = valid_names.sum() print(f"符合条件的名字数量:{count}")
如果你更习惯用原生正则函数处理每个名字,也可以用apply方法:
def is_valid_name(name): # re.fullmatch 会检查整个字符串是否完全匹配正则,等价于加^和$ return bool(re.fullmatch(r'^[aeiouAEIOU].{5,}$', name)) count = name_series.apply(is_valid_name).sum() print(f"符合条件的名字数量:{count}")
两种方法都能得到正确结果,推荐第一种——pandas的str方法是专门为Series字符串处理优化的,速度比循环/apply快得多,尤其是数据集较大的时候。
内容的提问来源于stack exchange,提问作者Aine
相关产品推荐
相关产品推荐

