如何更简洁实现:DataFrame列值小于前值时替换为前值?
问题描述
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame( { 'a': [101, 90, 11, 120, 1] } )
需要生成新列y,最终输出如下:
a y 0 101 101.0 1 90 101.0 2 11 90.0 3 120 120.0 4 1 120.0
核心逻辑为:将列a中的每个值与其前一行的值比较,保留较大的那个。当前的实现方式如下:
df['x'] = df.a.shift(1) df['y'] = df[['a', 'x']].max(axis=1)
询问是否存在更简洁或基于内置方法的实现方式。
解决方案
有两种更简洁的实现方式,无需创建中间列:
- 使用Pandas
Series.combine()方法,直接对原列和移位后的列做元素级最大值比较:
df['y'] = df['a'].combine(df['a'].shift(1), max)
- 借助Numpy的
maximum()函数,实现同样的元素级最大值逻辑:
import numpy as np df['y'] = np.maximum(df['a'], df['a'].shift(1))
这两种方法都能直接得到目标列y,代码更紧凑,且属于Pandas/Numpy的原生内置方法,执行效率也更优。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

