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

Pandas:分组清洗含字符串列表的列后拆包展开至行的方法

Pandas分组聚合后过滤标签并展开的实现方法

你的需求很清晰:

  • 按Text列对DataFrame分组,把每组的tag字段聚合成字符串列表
  • 如果分组后的列表里同时存在'no'和'yes',就把这两类标签全部移除
  • 最后把处理后的列表拆包,还原成每行对应一个tag的结构

原始数据集

Text             tag
   drink coke       mic
   eat pizza        mic
   eat fruits       yes
   eat banana       yes
   eat banana       mic
   eat fruits       mic
   eat pizza        no
   eat pizza        mic
   eat pizza        yes
   drink coke       yes
   drink coke       no
   drink coke       no
   drink coke       yes

你已完成的分组步骤

你已经写出了分组聚合的代码:

df = pd.DataFrame(df.groupby(['text'])['tag'].apply(lambda x: list(x.values)))

分组后得到的中间数据:

Text           labels               
  eat pizza      [mic,no,mic,yes]    
  eat fruits     [yes,mic]           
  eat banana     [yes,mic]           
  drink coke     [yes,yes,no,no,yes] 

完整实现方案

接下来只需要在分组逻辑里加入过滤规则,再把列表拆回行结构就行,这里给两种实现方式:

方式一:分组时直接完成过滤

可以把过滤逻辑直接写在apply里,一步到位:

import pandas as pd

# 先构造原始DataFrame(如果你的数据已经读入可以跳过这步)
data = [
    ["drink coke", "mic"],
    ["eat pizza", "mic"],
    ["eat fruits", "yes"],
    ["eat banana", "yes"],
    ["eat banana", "mic"],
    ["eat fruits", "mic"],
    ["eat pizza", "no"],
    ["eat pizza", "mic"],
    ["eat pizza", "yes"],
    ["drink coke", "yes"],
    ["drink coke", "no"],
    ["drink coke", "no"],
    ["drink coke", "yes"],
]
df = pd.DataFrame(data, columns=["Text", "tag"])

# 分组+过滤合并执行
grouped = df.groupby('Text')['tag'].apply(
    lambda tags: [t for t in tags if not (('yes' in tags) and ('no' in tags) and t in ['yes', 'no'])]
).reset_index(name='tag')

# 拆分列表为多行
result = grouped.explode('tag').reset_index(drop=True)
print(result)

方式二:先分组再单独处理过滤

如果需要保留分组后的原始列表作为中间结果,可以分两步处理:

# 第一步:分组得到标签列表
grouped_df = df.groupby('Text')['tag'].apply(list).reset_index().rename(columns={'tag': 'labels'})

# 第二步:编写过滤函数并应用
def filter_tags(tag_list):
    has_both = 'yes' in tag_list and 'no' in tag_list
    if has_both:
        return [t for t in tag_list if t not in ['yes', 'no']]
    return tag_list

grouped_df['filtered_tags'] = grouped_df['labels'].apply(filter_tags)

# 第三步:拆分列表为多行并整理结果
result = grouped_df.explode('filtered_tags').rename(columns={'filtered_tags': 'tag'})[['Text', 'tag']].reset_index(drop=True)
print(result)

最终输出结果

运行上述代码后,就能得到你想要的结果:

Text   tag
0  drink coke   mic
1   eat pizza   mic
2   eat pizza   mic
3   eat fruits  yes
4   eat fruits  mic
5   eat banana  yes
6   eat banana  mic

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33