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

如何删除DataFrame中与前一行(除日期外)数据相同的行?

移除DataFrame中团队积分无变化的重复行(排除日期列)

你需要保留那些至少有一个团队积分发生变化的行,同时保留第一行(因为它没有前一行可对比),最终输出仍为DataFrame类型。

示例数据

rowdateTeam ATeam B
007-01-242pts2pts
107-02-242pts2pts
207-03-244pts2pts

优化实现方案

你的思路方向是对的,但当前代码会生成DataFrame列表,需要合并才能得到最终结果。更高效的做法是利用Pandas的向量化操作,避免循环:

import pandas as pd

# 创建示例DataFrame
data = {
    'date': ['07-01-24', '07-02-24', '07-03-24'],
    'Team A': ['2pts', '2pts', '4pts'],
    'Team B': ['2pts', '2pts', '2pts']
}
df = pd.DataFrame(data)

# 1. 提取非日期列,计算与前一行的差异
non_date_cols = df.columns[1:]
changes = df[non_date_cols].ne(df[non_date_cols].shift())

# 2. 生成筛选规则:保留第一行,或任意列有变化的行
mask = changes.any(axis=1) | (df.index == 0)

# 3. 筛选得到结果
result_df = df[mask]

print(result_df)

输出结果

date Team A Team B
0  07-01-24   2pts   2pts
2  07-03-24   4pts   2pts

代码说明

  • df[non_date_cols].shift():把非日期列的数据向下偏移一行,让每一行能和前一行做对比
  • .ne():判断对应位置的值是否不相等,返回布尔值组成的DataFrame
  • changes.any(axis=1):检查每一行是否至少有一个列发生了变化
  • mask 同时满足"保留第一行"和"保留有变化的行"两个条件,确保初始数据不被遗漏

如果要基于你原本的思路修改,只需把生成的列表合并为DataFrame:

# 基于你的思路调整,合并列表为DataFrame
filtered_dfs = [
    df.iloc[[i]] for i in df.index 
    if i == 0 or any(df.iloc[:, 1:].iloc[i] != df.iloc[:, 1:].iloc[i-1])
]
result_df = pd.concat(filtered_dfs)

但第一种向量化方法的效率更高,尤其当你的DataFrame行数较多时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:21:09