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

如何判断同ID下方行是否存在值大于当前行并生成Y/N条件列

问题:创建条件列判断同ID下方行是否存在更大值

我需要为DataFrame创建一个名为Y/N的条件列,规则是:判断当前行下方所有同ID的行中是否存在Value大于当前行Value的情况,存在则返回Y,否则返回N。数据已按ID排序,示例DataFrame如下:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'ID': [223, 225, 225, 228, 230, 235, 235, 235, 235, 240, 241, 241, 241, 242],
     'Value': [0, 1, 0, 0, 0, 3, 2, 4, 1, 0, 2, 0, 1, 0]}
)

我尝试了以下代码,但它只能判断下一行是否满足条件,无法覆盖当前行下方所有同ID的行:

cond_ID = df['ID'] == df['ID'].shift(-1)
cond_Value = df['Value'] < df['Value'].shift(-1)
df['Y/N'] = np.where((cond_ID) & (cond_Value), 'Y', 'N')

期望得到的结果如下:

df_outcome = pd.DataFrame(
    {'ID': [223, 225, 225, 228, 230, 235, 235, 235, 235, 240, 241, 241, 241, 242],
     'Value': [0, 1, 0, 0, 0, 3, 2, 4, 1, 0, 2, 0, 1, 0],
     'Y/N': ['N', 'N', 'N', 'N', 'N', 'Y', 'Y', 'N', 'N', 'N', 'N', 'Y', 'N', 'N']}
)

解决方案

核心思路是:按ID分组后,计算每组内每行下方所有行的最大值,再和当前行Value比较。具体代码如下:

# 按ID分组,计算每组内每行及下方所有行的最大值
df['max_lower'] = df.groupby('ID')['Value'].transform(lambda x: x[::-1].cummax()[::-1])
# 比较当前Value是否小于下方行的最大值(shift(-1)排除当前行本身)
df['Y/N'] = np.where(df['Value'] < df['max_lower'].shift(-1), 'Y', 'N')
# 可选:删除临时辅助列
df = df.drop('max_lower', axis=1)

代码解释

  1. 反向累积最大值计算:x[::-1].cummax()[::-1]先将每组的Value倒序,计算累积最大值(此时得到的是从下往上的最大值序列),再倒序回来,最终得到每组中每行对应的当前行及下方所有行的最大值。
  2. 排除当前行:用shift(-1)将最大值列向下移动一行,这样就得到了当前行下方所有行的最大值,完美匹配需求。
  3. 结果判断:用np.where比较当前Value和下方行最大值,满足条件返回Y,否则返回N;每组最后一行因shift(-1)得到NaN,自动返回N,符合逻辑。

运行后得到的结果与期望完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:35:25