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
相关产品推荐
相关产品推荐

