如何删除DataFrame中与前一行(除日期外)数据相同的行?
移除DataFrame中团队积分无变化的重复行(排除日期列)
你需要保留那些至少有一个团队积分发生变化的行,同时保留第一行(因为它没有前一行可对比),最终输出仍为DataFrame类型。
示例数据
| row | date | Team A | Team B |
|---|---|---|---|
| 0 | 07-01-24 | 2pts | 2pts |
| 1 | 07-02-24 | 2pts | 2pts |
| 2 | 07-03-24 | 4pts | 2pts |
优化实现方案
你的思路方向是对的,但当前代码会生成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():判断对应位置的值是否不相等,返回布尔值组成的DataFramechanges.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
相关产品推荐
相关产品推荐

