如何统计DF行中字母出现次数并构建26列特征矩阵?
解决方案:统计DataFrame每行字符串的字母出现次数
下面提供两种成熟的实现方法,按需选择:
方法1:简洁直观的apply+Counter方案
适合中小规模数据,代码可读性强:
import pandas as pd from collections import Counter import string # 示例原DataFrame(替换成你的实际数据) df = pd.DataFrame({'text': ['this is a string', 'hello world', 'python pandas']}) # 生成a-z的字母列表,作为新DataFrame的列名 alphabet = list(string.ascii_lowercase) # 定义每行的字母统计函数 def count_single_row(s): # 统一转小写,避免大小写干扰 s_lower = s.lower() # 统计字符出现次数 char_counter = Counter(s_lower) # 按字母顺序返回次数,未出现的字母返回0 return pd.Series([char_counter.get(letter, 0) for letter in alphabet], index=alphabet) # 逐行应用函数,生成统计结果的DataFrame letter_count_df = df['text'].apply(count_single_row) # 可选:把统计结果和原DataFrame合并 final_df = pd.concat([df, letter_count_df], axis=1)
方法2:矢量化高效方案
如果你的数据量很大,apply的循环效率较低,用矢量化操作更快:
import pandas as pd import string df = pd.DataFrame({'text': ['this is a string', 'hello world', 'python pandas']}) alphabet = list(string.ascii_lowercase) # 拆分字符→转哑变量→按原索引求和→按字母顺序整理列 letter_count_df = (df['text'].str.lower() .str.split('', expand=True) # 把字符串拆成单个字符的列 .stack() # 转成层级索引的Series .str.get_dummies() # 生成每个字符的哑变量 .sum(level=0) # 按原行索引求和 [alphabet]) # 按a-z顺序筛选列 final_df = pd.concat([df, letter_count_df], axis=1)
注意事项
- 如果需要区分大小写,去掉代码中的
.lower(),同时把alphabet改成list(string.ascii_letters)(包含大小写共52列),但你的需求是26列,所以统一转大小写更合适。 - 字符串中的非字母字符(比如空格、标点)会被自动忽略,不会计入统计。
内容的提问来源于stack exchange,提问作者Tam
相关产品推荐
相关产品推荐

