如何从fakeprofile.csv中提取并统计最常见的名字?
解决提取CSV行首名字并统计高频的问题
你的问题核心在于原正则会匹配所有符合大写开头的单词,而没有限定只提取每行开头的名字部分。结合你的CSV结构(每行开头是名字,紧接着是固定格式的SSN),我们可以针对性地处理每行数据,精准提取名字后再统计频率。
步骤1:精准提取每行的名字
你的CSV每行格式是:[名字] [SSN] [城市] [地址] [邮箱],其中SSN是XXX-XX-XXXX的固定格式。我们可以利用这一点,用正则匹配每行中SSN之前的内容作为名字;或者逐行读取后,通过SSN的特征分割字符串。
步骤2:统计名字出现频率
使用Python的collections.Counter可以高效统计高频元素,比手动统计更简洁。
修改后的完整代码
import re from collections import Counter # 逐行读取文件,提取每行的名字 names_list = [] with open('fakeprofile.csv', 'r') as f: for line in f: line = line.strip() if not line: continue # 用正则匹配SSN格式,提取SSN之前的内容作为名字 # 正则解释:^匹配行首,.*?非贪婪匹配到SSN格式之前的内容 match = re.match(r'^(.*?) \d{3}-\d{2}-\d{4}', line) if match: full_name = match.group(1).strip() names_list.append(full_name) # 统计名字频率 name_counter = Counter(names_list) # 获取最常见的前N个名字(这里取前5个示例) most_common_names = name_counter.most_common(5) print("最常见的名字及出现次数:") for name, count in most_common_names: print(f"{name}: {count}次")
代码解释
- 逐行读取:避免一次性读取大文件占用过多内存,同时方便处理每行数据。
- 正则匹配名字:
r'^(.*?) \d{3}-\d{2}-\d{4}'中:^锚定行首,确保只匹配每行开头的内容.*?非贪婪匹配,直到遇到第一个SSN的前缀空格(因为SSN是固定格式,前面的就是名字)\d{3}-\d{2}-\d{4}精确匹配SSN的格式,确保分割点准确
- Counter统计:
Counter会自动统计每个名字的出现次数,most_common()方法可以直接返回高频结果。
额外优化:如果需要单独统计名(First Name)或姓(Last Name)
如果你想统计最常见的名(比如Alicia、Nicole),可以在提取全名后再分割:
# 修改提取后的处理逻辑 first_names = [] for full_name in names_list: # 分割全名,取第一个词作为名 first_name = full_name.split()[0] first_names.append(first_name) first_name_counter = Counter(first_names) print("最常见的名及出现次数:") for name, count in first_name_counter.most_common(5): print(f"{name}: {count}次")
这样就能精准提取你需要的名字数据,避免无关的地名、地址词汇干扰啦。
内容的提问来源于stack exchange,提问作者Pkd
相关产品推荐
相关产品推荐

