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
相关产品推荐
相关产品推荐

