基于条件创建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
相关产品推荐
相关产品推荐

