Pandas如何获取DataFrame中3个object类型文本列的去重并集
问题描述
- 需求:提取DataFrame中3个object类型列A、B、C的所有值,做全局并集去重
- 示例数据:
| A | B | C |
|---|---|---|
| Cat | Dog | Monkey |
| Dog | Horse | Cat |
- 期望输出:
[Cat,Dog,Horse,Monkey] - 初始尝试代码:
df['union'] = df.apply(lambda x: x['A'].union(x['B']), axis=1)
- 运行报错:
AttributeError: 'str' object has no attribute 'union'
报错原因
- 代码中
x['A']、x['B']取到的是逐行单元格内的字符串值,字符串类型本身没有union方法,只有集合(set)类型支持该方法 - 原逻辑是逐行对单行的两个单元格值做操作,无法实现三列所有值的全局去重需求
可直接运行的实现方案
方案1:展平去重(推荐,保留值首次出现顺序)
通过stack()将三列的所有值展平为一维序列,去重后直接转列表即可:
# 提取三列所有值去重 union_list = df[['A', 'B', 'C']].stack().drop_duplicates().tolist()
如果需要对结果排序,可在去重后加排序逻辑:
# 去重+按字母排序 union_list = df[['A', 'B', 'C']].stack().drop_duplicates().sort_values().tolist()
方案2:集合取并集
将每列的值转为集合后做并集运算,最后转成列表:
union_list = list(set(df['A']).union(set(df['B'])).union(set(df['C'])))
注意:集合是无序结构,该方案得到的结果顺序不固定,对顺序有要求时优先选方案1
内容的提问来源于stack exchange,提问作者user19333501
相关产品推荐
相关产品推荐

