如何判断同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)
代码解释
- 反向累积最大值计算:
x[::-1].cummax()[::-1]先将每组的Value倒序,计算累积最大值(此时得到的是从下往上的最大值序列),再倒序回来,最终得到每组中每行对应的当前行及下方所有行的最大值。 - 排除当前行:用
shift(-1)将最大值列向下移动一行,这样就得到了当前行下方所有行的最大值,完美匹配需求。 - 结果判断:用
np.where比较当前Value和下方行最大值,满足条件返回Y,否则返回N;每组最后一行因shift(-1)得到NaN,自动返回N,符合逻辑。
运行后得到的结果与期望完全一致。
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

