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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:01:26