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

如何基于Time列与上行匹配条件清除DataFrame重复列值?

问题描述

我的DataFrame里,当Time列的值和上一行相同时,Data 1、Data 2、Data 3列会出现重复内容。但每行的Message 1和Message 2是唯一的,所以不想删整行,只想保留每个相同Time组里Data列的第一个实例,把其他重复值换成空字符串''。

数据集示例

TimeMessage 1Message 2Data 1Data 2Data 3
11:38:24NoticeTextA1A2A3
11:38:25ErrorTextB1B2B3
11:38:26MessageTextC1C2C3
11:38:27ErrorTextD1D2D3
11:38:27NoticeTextD1D2D3
11:38:27ErrorTextD1D2D3
11:38:28MessageTextE1E2E3
11:38:28NoticeTextE1E2E3
11:38:28ErrorTextE1E2E3

尝试的错误代码

condition = df['Time'].shift(1).str == ['Time']
df.loc[condition, 'Data 1'] = ''
df.loc[condition, 'Data 2'] = ''
df.loc[condition, 'Data 3'] = ''

运行后报错:KeyError: 'cannot use a single bool to index into setitem'

目标结果

TimeMessage 1Message 2Data 1Data 2Data 3
11:38:24NoticeTextA1A2A3
11:38:25ErrorTextB1B2B3
11:38:26MessageTextC1C2C3
11:38:27ErrorTextD1D2D3
11:38:27NoticeText
11:38:27ErrorText
11:38:28MessageTextE1E2E3
11:38:28NoticeText
11:38:28ErrorText

解决方案

错误原因

你写的条件完全不对:

  • ['Time']是个字符串列表,不是DataFrame的Time列,没法和shift(1)后的结果做对比
  • 就算改成df['Time'],这种逐行对比的方式只能处理连续两行重复的情况,没法覆盖同一个Time有3行及以上的场景

正确代码

方法一:高效批量处理

这是最简洁高效的方式:

# 标记每个Time组里除第一行外的所有重复行
mask = df.duplicated(subset='Time', keep='first')
# 把这些行的Data列批量设为空字符串
df.loc[mask, ['Data 1', 'Data 2', 'Data 3']] = ''

方法二:分组自定义处理

如果需要对每个Time组做更多自定义操作,可以用分组处理:

def clean_group(group):
    # 只保留组内第一行的Data值,其他行设为空
    group.loc[group.index != group.index[0], ['Data 1', 'Data 2', 'Data 3']] = ''
    return group

# 按Time分组并应用处理函数
df = df.groupby('Time', group_keys=False).apply(clean_group)

代码说明

  • 方法一中的df.duplicated(subset='Time', keep='first')会生成一个布尔数组,True表示当前行是该Time的重复行(不是第一个出现的)
  • 直接用这个布尔数组定位目标行,批量修改指定列,比逐行处理快很多
  • 方法二适合需要对每组做额外逻辑的场景,比如除了空值还要做其他修改时更灵活

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:26:06