如何通过apply()与自定义函数统计DataFrame中长字符串的出现次数?
问题
我有如下Pandas DataFrame:
import pandas as pd from collections import Counter print(sentences)
输出结果如下(列名为0):
0 0 A 1 B 2 C 3 D 4 EEE ... ... 462064467 FGH 462064468 QRS 462064469 EEE 462064470 VWXYZ 462064471 !!! [462064472 rows x 1 columns]
我写了一个自定义函数判断列0中内容长度是否大于1:
def is_more_than_one_character(t): if len(t) > 1: return True else: return False
并按如下方式应用:
counter = Counter(sentences.apply(is_more_than_one_character))
我想统计每个长度大于1的字符串的出现次数,预期输出类似:
[(EEE, 2), (FGH, 1), (QRS, 1), (!!!, 1)...]
但当前得到的输出是:
[(False, 460686058), (True, 1378414)]
请问我遗漏了什么?
解决方案
你现在的代码是把**判断结果(True/False)**传给了Counter,所以统计的是符合/不符合条件的行数,而非目标字符串本身。要实现需求,需先筛选出长度大于1的字符串,再对这些字符串做计数:
方法1:先筛选再计数(推荐)
直接用布尔索引过滤出长度>1的行,再提取列值传给Counter:
# 筛选长度大于1的字符串 filtered_strings = sentences[sentences[0].str.len() > 1][0] # 统计出现次数 counter = Counter(filtered_strings) # 转为预期的列表格式 result = list(counter.items())
方法2:调整自定义函数(可选)
如果一定要用自定义函数,无需返回布尔值,而是返回原字符串(或空值),再过滤空值后计数:
def get_long_strings(t): return t if len(t) > 1 else None # 应用函数后剔除空值,再统计 filtered_strings = sentences[0].apply(get_long_strings).dropna() counter = Counter(filtered_strings) result = list(counter.items())
核心问题点
你之前的sentences.apply(is_more_than_one_character)会把整个列转换成布尔值序列,Counter自然只会统计True和False的数量。正确逻辑是先筛选出目标字符串,再对字符串本身做计数,而非对筛选条件的结果计数。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

