如何使用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
相关产品推荐
相关产品推荐

