如何高效将DataFrame中'others'列的无序集合转为数值?
处理方案
核心思路
集合是无序且不可哈希的,没法直接用作映射键。我们先把每个集合转成排序后的元组——相同内容的集合,排序后生成的元组完全一致,且元组是可哈希的;再用pd.factorize给每个唯一元组分配专属整数ID,既能保证内容相同的集合对应同一数值,又能高效处理数据。
具体代码
import pandas as pd # 你的原始数据 data = [['A', 10, {'Cc', 'Dd'}], ['B', 15, {'Aa', 'Dd', 'Cc', 'Ee'}], ['C', 14, {'Dd', 'Ee', 'Aa'}],['D', 3, {'Bb'}],['E', 3,{'Dd', 'Cc'}]] df = pd.DataFrame(data, columns=['type', 'val', 'others']) # 已完成的type列转换 dic_type ={'A':0, 'B':1, 'C':2, 'D':3, 'E':4} df["type"].replace(dic_type, inplace=True) # 处理others列 # 1. 将集合转为排序后的元组(统一相同内容集合的键形式) df['others_tuple'] = df['others'].apply(lambda x: tuple(sorted(x))) # 2. 用factorize生成唯一整数ID,返回的第一个值是映射后的数组 df['others_num'], _ = pd.factorize(df['others_tuple']) # 可选:删除中间生成的辅助列 df.drop('others_tuple', axis=1, inplace=True) print(df)
效果与效率说明
运行后第一行和最后一行的others会被映射为同一个整数,完全符合需求。pd.factorize是Pandas内置的高效函数,处理6000+行数据毫无压力,速度远快于手动遍历或自定义字典映射。
扩展优化(可选)
如果需要把集合里的字符串元素也转为数值(适配更严格的数值型分析场景),可以先给所有元素分配ID,再生成数值化的排序元组:
# 提取所有集合中的唯一元素 all_elements = set().union(*df['others']) # 给每个元素分配唯一ID element_id = {elem:i for i, elem in enumerate(sorted(all_elements))} # 集合转成排序后的数值元组,再映射为最终ID df['others_num'], _ = pd.factorize(df['others'].apply(lambda x: tuple(sorted(element_id[elem] for elem in x))))
内容的提问来源于stack exchange,提问作者Shasa
相关产品推荐
相关产品推荐

