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

R语言数据框行筛选:按分组后v2递增时v3必增规则处理

解决方法:按分组筛选v3随v2递增的行

针对你的需求——按v1分组,在v2递增的前提下保留v3始终递增(且处理相等值时保留最后一行),我们可以用Pandas分步骤实现,以下是完整的解决方案:

步骤说明

  1. 确保v2正确排序:因为v2是字符串格式(比如">50"),直接排序会出错,所以先提取每个区间的起始数值作为排序依据。
  2. 计算分组内的累积最大值:对每个v1分组,计算v3的累积最大值,这样就能快速筛选出不破坏递增趋势的行。
  3. 去重保留最新行:如果同一分组内有多个行的v3等于累积最大值(即v3相等),只保留v2最靠后的那一行。

完整代码

import pandas as pd

# 构建原始DataFrame
data = {
    'v1': ['ABC', 'ABC', 'ABC', 'DEF', 'DEF', 'DEF', 'DEF', 'XYZ', 'XYZ', 'XYZ'],
    'v2': ['0-10', '10-20', '20-30', '10-20', '20-30', '30-40', '40-50', '30-40', '40-50', '>50'],
    'v3': [3, 2, 4, 2.5, 3, 1.1, 2.7, 2, 2, 1]
}
df = pd.DataFrame(data)

# 提取v2区间的起始数值,用于正确排序
def get_v2_start(v2_str):
    if v2_str == '>50':
        return 50
    return int(v2_str.split('-')[0])

# 添加辅助列并按v1和v2起始值排序,确保v2是递增顺序
df['v2_start'] = df['v2'].apply(get_v2_start)
df_sorted = df.sort_values(['v1', 'v2_start']).reset_index(drop=True)

# 按v1分组,计算每个分组内v3的累积最大值
df_sorted['cum_max_v3'] = df_sorted.groupby('v1')['v3'].cummax()

# 筛选出v3等于累积最大值的行(这些行没有破坏递增趋势)
filtered = df_sorted[df_sorted['v3'] == df_sorted['cum_max_v3']]

# 对每个(v1, v3)组合,保留v2最靠后的行(处理v3相等的情况)
result = filtered.groupby(['v1', 'v3'], as_index=False).last()

# 整理最终结果,移除辅助列并排序
result = result[['v1', 'v2', 'v3']].sort_values(['v1', 'v2_start']).drop('v2_start', axis=1).reset_index(drop=True)

# 打印结果
print(result)

输出结果

运行代码后,你会得到预期的DataFrame:

v1     v2   v3
0  ABC   0-10  3.0
1  ABC  20-30  4.0
2  DEF  10-20  2.5
3  DEF  20-30  3.0
4  XYZ  40-50  2.0

逻辑解释

  • 排序处理:通过v2_start辅助列,确保v2按实际区间递增顺序排列,避免字符串排序的错误(比如">50"不会排在"0-10"前面)。
  • 累积最大值筛选:cummax()会记录每个分组到当前行为止的最大v3值,只有当当前行的v3等于这个最大值时,才说明它没有打破递增趋势。
  • 去重保留最后一行:当同一分组内出现v3相等的行时,groupby(['v1', 'v3']).last()会保留v2最靠后的那一行,完美匹配你给出的预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:19:03