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

基于条件创建Pandas新列并通过shift选取最大值

Pandas 按条件生成新列问题解决

原始数据

import pandas as pd

df = pd.DataFrame(
    {
        'a': [10, 20, 30, 400, 50, 60],
        'b': [897, 9, 33, 4, 55, 65]
    }
)

需求目标

需要生成新列c,期望输出如下:

a    b      c
0   10  897    NaN
1   20    9  897.0
2   30   33    NaN
3  400    4  400.0
4   50   55    NaN
5   60   65    NaN

具体规则:

  • 仅对满足df.a > df.b的行填充c列,其余行保持NaN
  • 对符合条件的行,比较当前行的a值与前一行的b值:
    • 若当前行a更大,c列填当前行的a值
    • 否则填前一行的b值

问题分析

你尝试的代码df.loc[df.a > df.b, 'c'] = max(df.a, df.b.shift(1))无法正常运行,原因是max(df.a, df.b.shift(1))会直接对整个Series取全局最大值,而非逐行进行元素级比较,无法实现需求中的逐行判断逻辑。

解决方案

方法1:使用combine方法逐行比较

import pandas as pd

df = pd.DataFrame(
    {
        'a': [10, 20, 30, 400, 50, 60],
        'b': [897, 9, 33, 4, 55, 65]
    }
)

# 获取前一行的b值
prev_b = df['b'].shift(1)
# 筛选出a > b的行
mask = df['a'] > df['b']
# 对符合条件的行,取当前a和前一行b的较大值
df.loc[mask, 'c'] = df.loc[mask, 'a'].combine(prev_b[mask], max)

print(df)

方法2:使用numpy.where简化代码

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        'a': [10, 20, 30, 400, 50, 60],
        'b': [897, 9, 33, 4, 55, 65]
    }
)

prev_b = df['b'].shift(1)
mask = df['a'] > df['b']
# 按条件赋值:符合条件则取a和prev_b的最大值,否则为NaN
df['c'] = np.where(mask, np.maximum(df['a'], prev_b), np.nan)

print(df)

两种方法都能得到你期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:53:14