如何计算Pandas DataFrame列中集合的长度并新增结果列
问题根源
你列里存储的集合本质是单元素集合:每个集合内仅包含1个完整的长字符串,所有你以为的独立字符串,其实都是这个长字符串里被逗号分隔的文本片段,不是集合的独立元素。这也是你直接调用len()统计集合长度永远返回1的核心原因,之前写的自定义函数实际是在统计单个长字符串的字符总数,自然得不到正确结果。
正确实现代码
分两种场景处理:
场景1:列内存储的是Python原生集合对象
直接取出集合内的唯一长字符串,按逗号拆分后统计元素数量即可:
# 新增列存储集合内实际的字符串元素个数 df['x_length'] = df['x'].apply( lambda cell: len([item.strip() for item in next(iter(cell)).split(',')]) )
代码逻辑说明:
next(iter(cell)):取出单元素集合里唯一的长字符串split(','):按逗号把长字符串拆成独立片段strip():去掉每个片段前后的多余空格len():统计拆分后的有效元素个数
场景2:列内存储的是字符串格式的集合(比如CSV读入后是"{a,b,c}"这类文本)
先把文本格式的集合转成Python原生集合,再执行上述统计逻辑:
import ast # 先把文本格式的集合转成原生集合对象 df['x'] = df['x'].apply(ast.literal_eval) # 再统计元素个数 df['x_length'] = df['x'].apply( lambda cell: len([item.strip() for item in next(iter(cell)).split(',')]) )
效果验证
用你提供的样例数据测试:
import pandas as pd # 构造样例数据 df = pd.DataFrame( {'x': [{'string1, string2, string3'}, {'string4, string5'}]}, index=['A', 'B'] ) # 执行统计代码 df['x_length'] = df['x'].apply( lambda cell: len([item.strip() for item in next(iter(cell)).split(',')]) ) print(df)
输出完全匹配你的预期:
x x_length A {string1, string2, string3} 3 B {string4, string5} 2
之前方法失效的原因
df['x'].str.len():该方法用于统计字符串长度,作用在集合对象上时实际返回集合本身的元素数,也就是固定值1df['x'].apply(lambda x: len(x)):直接统计集合的元素个数,因为每个集合只有1个字符串元素,所以返回值全为1- 自定义
to_1D函数:两层循环把集合内的单个字符串拆成了逐个字符,统计的是所有字符的总数量,和需求完全不符
内容的提问来源于stack exchange,提问作者alestamm
相关产品推荐
相关产品推荐

