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

如何使用Pandas计算DataFrame单列的唯一符号数量

嘿,我来帮你搞定计算DataFrame每列唯一符号数量的问题!先明确下你的需求:统计每列中所有字符串里出现的单个唯一字符数量,空字符串不算在内对吧?就像你示例里的col1,实际有效字符是a、b、c,共3个;col2是d、e、f、g,共4个。

先给你几个简洁又好用的解法,你可以根据自己的场景选:

方法1:用apply+集合(简洁直观)

这个方法用pandas的apply函数对每列批量处理,代码很清爽:

import pandas as pd

df = pd.DataFrame({'col1': ['a', 'bbb', 'cc', ''], 'col2': ['ddd', 'eeeee', 'ff', 'ggggggg']})

def count_unique_chars(col):
    # 把列里所有非空、非NA的字符串拼接成一个大字符串
    combined = ''.join(str(val) for val in col if pd.notna(val) and val != '')
    # 转成集合去重,直接取长度就是唯一字符数
    return len(set(combined))

# 对每列应用函数,得到结果
unique_counts = df.apply(count_unique_chars)
print(unique_counts)

运行后输出:

col1    3
col2    4
dtype: int64

这个函数里,我们先过滤掉空字符串和NA值,避免它们干扰统计;然后把剩下的字符串拼接起来,用集合自动去重,最后返回集合的长度就搞定了。

方法2:贴近你原来的循环思路(容易理解)

看你原来的代码是想循环列、收集出现过的符号,那可以把你的思路补全优化下:

unique_symbols_counts = []
for col_name in df.columns:
    observed_chars = set()  # 用集合自动去重,比列表效率高
    for value in df[col_name]:
        # 跳过空值和空字符串
        if pd.isna(value) or value == '':
            continue
        # 把当前值的每个字符加入集合
        observed_chars.update(str(value))
    unique_symbols_counts.append(len(observed_chars))

# 转成带列名的Series,结果更清晰
result = pd.Series(unique_symbols_counts, index=df.columns)
print(result)

这个逻辑和你最初的想法一致,用集合存储出现过的字符,避免手动判断是否重复,代码更简洁高效。

方法3:大数据量优化版(高效)

如果你的DataFrame特别大,上面的方法可能有点慢,试试用生成器表达式来减少内存开销:

unique_counts = pd.Series(
    [
        len(set(
            char 
            for val in df[col] 
            if pd.notna(val) and val != '' 
            for char in str(val)
        )) 
        for col in df.columns
    ],
    index=df.columns
)

这个写法用嵌套生成器,直接遍历每个字符,不用拼接大字符串,内存占用更少,处理大数据时速度更快。

注意点

  • 如果你的列里有None值,记得用pd.notna()过滤,不然str(None)会变成字符串'None',会把N、o、n这些字符算进去;
  • 如果空字符串需要被统计(比如你想把''也算一个符号),那去掉过滤条件里的val != ''就行。

内容的提问来源于stack exchange,提问作者Alien13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:52