如何基于Time列与上行匹配条件清除DataFrame重复列值?
问题描述
我的DataFrame里,当Time列的值和上一行相同时,Data 1、Data 2、Data 3列会出现重复内容。但每行的Message 1和Message 2是唯一的,所以不想删整行,只想保留每个相同Time组里Data列的第一个实例,把其他重复值换成空字符串''。
数据集示例
| Time | Message 1 | Message 2 | Data 1 | Data 2 | Data 3 |
|---|---|---|---|---|---|
| 11:38:24 | Notice | Text | A1 | A2 | A3 |
| 11:38:25 | Error | Text | B1 | B2 | B3 |
| 11:38:26 | Message | Text | C1 | C2 | C3 |
| 11:38:27 | Error | Text | D1 | D2 | D3 |
| 11:38:27 | Notice | Text | D1 | D2 | D3 |
| 11:38:27 | Error | Text | D1 | D2 | D3 |
| 11:38:28 | Message | Text | E1 | E2 | E3 |
| 11:38:28 | Notice | Text | E1 | E2 | E3 |
| 11:38:28 | Error | Text | E1 | E2 | E3 |
尝试的错误代码
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'
目标结果
| Time | Message 1 | Message 2 | Data 1 | Data 2 | Data 3 |
|---|---|---|---|---|---|
| 11:38:24 | Notice | Text | A1 | A2 | A3 |
| 11:38:25 | Error | Text | B1 | B2 | B3 |
| 11:38:26 | Message | Text | C1 | C2 | C3 |
| 11:38:27 | Error | Text | D1 | D2 | D3 |
| 11:38:27 | Notice | Text | |||
| 11:38:27 | Error | Text | |||
| 11:38:28 | Message | Text | E1 | E2 | E3 |
| 11:38:28 | Notice | Text | |||
| 11:38:28 | Error | Text |
解决方案
错误原因
你写的条件完全不对:
['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
相关产品推荐
相关产品推荐

