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

Pandas:根据两列关联变化筛选DataFrame行

解决方案

要检测col_2和col_3的关联变化并筛选DataFrame,核心是将两列的组合视为一个整体,判断其与前一行是否不同,以下是具体实现:

通用方案:检测连续行的组合变化

该方案会保留所有与前一行col_2-col_3组合不同的行(包含第一行),适用于追踪每一次关联关系的切换:

步骤1:构造示例数据与组合列

import pandas as pd

# 构造你提供的示例DataFrame
data = {
    'col_1': ['t_1', 't_2', 't_3', 't_4', 't_5', 't_6', 't_7', 't_8'],
    'col_2': ['A', 'A', 'B', 'A', 'A', 'A', 'B', 'A'],
    'col_3': ['a_1', 'a_1', 'b_1', 'a_1', 'a_2', 'a_2', 'b_2', 'a_1']
}
df = pd.DataFrame(data)

# 将col_2和col_3合并为一个组合列,方便比较关联关系
df['comb'] = df['col_2'] + '_' + df['col_3']

步骤2:标记组合变化的行

# 用shift()获取上一行的组合,判断当前行与上一行是否不同
change_mask = df['comb'].ne(df['comb'].shift())

步骤3:筛选并整理结果

# 筛选变化行,删除临时组合列
result = df[change_mask].drop('comb', axis=1)
print(result)

输出结果

col_1 col_2 col_3
0   t_1     A   a_1
2   t_3     B   b_1
3   t_4     A   a_1
4   t_5     A   a_2
6   t_7     B   b_2
7   t_8     A   a_1

匹配示例期望的调整方案

如果需要和你给出的期望结果完全一致(即不保留t_4行),说明需求是保留每个新组合的首次出现 + 最后一行,可以这样实现:

# 标记每个组合的首次出现
first_occur_mask = ~df['comb'].duplicated()
# 标记最后一行
last_row_mask = pd.Series([False]*len(df))
last_row_mask.iloc[-1] = True
# 合并两个筛选条件
final_mask = first_occur_mask | last_row_mask

# 筛选结果并删除临时列
result = df[final_mask].drop('comb', axis=1)
print(result)

输出结果

col_1 col_2 col_3
0   t_1     A   a_1
2   t_3     B   b_1
4   t_5     A   a_2
6   t_7     B   b_2
7   t_8     A   a_1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:28:19