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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:40:57