如何为Pandas DataFrame新增erased_words列计算同文本删除词集合
解决Pandas中按组计算连续编辑词集合差集的问题
我来帮你搞定这个按文本组计算连续编辑删除词集合的需求,下面是完整的可落地实现方案:
步骤1:数据准备与words列预处理
首先我们先构造测试数据(你可以直接替换成自己的真实数据),然后处理words列转为集合——这里要注意去除每个词前后的空格,避免出现' blue'和'blue'这种看似相同实则不同的集合元素:
import pandas as pd # 构造测试数据集 data = { 'text_id': [1,1,2,3,3,3,4,4,5], 'name': ['John','John','Anne','Anne','Mark','Ethan','Paul','John','Paul'], 'date': ['2018-01-01','2018-02-01','2018-03-01','2018-03-01','2018-04-01','2018-05-01','2018-01-01','2018-02-01','2018-03-01'], 'words': ['{ocean, blue}','{ocean, green}','{table, chair}','{hot, cold, warm}','{hot, cold}','{warm, icy}','{cat, dog, puppy}','{cat}','{cat, sheep, deer}'] } df = pd.DataFrame(data) # 预处理words列:转为集合,同时清理每个词的前后空格 df['words'] = df['words'].str.strip('{}').str.split(',').apply(lambda x: set(word.strip() for word in x))
步骤2:计算erased_words列
核心逻辑是按text_id分组,在每个组内计算当前行words与上一行words的集合差集。我们用groupby+shift获取上一行数据,再通过自定义函数完成差集计算:
# 定义组内计算删除词的函数 def calculate_erased_words(group): # 拿到组内上一行的words,组内第一行对应的值是NaN previous_words = group['words'].shift(1) # 遍历每行,计算上一行集合减当前行集合;上一行不存在时返回空集合 group['erased_words'] = [prev - curr if pd.notna(prev) else set() for prev, curr in zip(previous_words, group['words'])] return group # 按text_id分组应用函数,保持原数据结构 df = df.groupby('text_id', group_keys=False).apply(calculate_erased_words)
步骤3:验证结果
运行完上述代码后,你可以打印查看最终结果:
print(df)
输出完全符合你的预期:
text_id name date words erased_words 0 1 John 2018-01-01 {blue, ocean} {} 1 1 John 2018-02-01 {green, ocean} {blue} 2 2 Anne 2018-03-01 {chair, table} {} 3 3 Anne 2018-03-01 {warm, cold, hot} {} 4 3 Mark 2018-04-01 {cold, hot} {warm} 5 3 Ethan 2018-05-01 {icy, warm} {cold, hot} 6 4 Paul 2018-01-01 {puppy, dog, cat} {} 7 4 John 2018-02-01 {cat} {puppy, dog} 8 5 Paul 2018-03-01 {deer, sheep, cat} {}
关键注意点
- 预处理时的空格清理很重要:如果忽略这一步,原数据中
{ocean, blue}拆分后会得到['ocean', ' blue'],集合元素带空格会导致差集计算完全错误。 group_keys=False参数确保分组处理后不会额外添加组键列,保持原DataFrame的结构整洁。- 针对组内第一行的
NaN值做了特殊处理,直接返回空集合,完全匹配需求。
内容的提问来源于stack exchange,提问作者HRDSL
相关产品推荐
相关产品推荐

