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

正则表达式排查:统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:33:16