如何用Pandas为新列填充另一列的历史最大值
问题:生成截至当前行的历史最大值列
当DataFrame某列值无序时,需新增一列填充该列截至当前行的历史最大值,使用rolling()方法尝试后结果不符合预期。
可复现示例
创建包含无序数值的DataFrame:
import pandas as pd # 生成无序数值列表 list_of_original_values = [100, 98, 102, 107, 94, 95, 96, 92, 150] # 创建DataFrame df = pd.DataFrame().assign(original_values=list_of_original_values)
生成的DataFrame如下:
| original_values | |
|---|---|
| 0 | 100 |
| 1 | 98 |
| 2 | 102 |
| 3 | 107 |
| 4 | 94 |
| 5 | 95 |
| 6 | 96 |
| 7 | 92 |
| 8 | 150 |
预期结果
预期新列的值为:[100, 100, 102, 107, 107, 107, 107, 107, 150],最终DataFrame如下:
list_of_expected_values = [100, 100, 102, 107, 107, 107, 107, 107, 150] df = df.assign(expected_values=list_of_expected_values)
| original_values | expected_values | |
|---|---|---|
| 0 | 100 | 100 |
| 1 | 98 | 100 |
| 2 | 102 | 102 |
| 3 | 107 | 107 |
| 4 | 94 | 107 |
| 5 | 95 | 107 |
| 6 | 96 | 107 |
| 7 | 92 | 107 |
| 8 | 150 | 150 |
错误尝试及原因
使用rolling(2).max()的结果不符合预期:
df = df.assign(try_1_with_rolling=lambda df: df['original_values'].rolling(2).max())
结果中第5、6、7行的try_1_with_rolling值错误,原因是rolling(2)仅计算最近2行的最大值,而非从第一行到当前行的所有历史值的最大值。
正确解法
直接使用Pandas的cummax()方法,该方法会计算列的累积最大值,即截至当前行的所有历史值的最大值:
df = df.assign(historical_max=lambda df: df['original_values'].cummax())
运行后得到的historical_max列与预期结果完全一致:
| original_values | expected_values | historical_max | |
|---|---|---|---|
| 0 | 100 | 100 | 100 |
| 1 | 98 | 100 | 100 |
| 2 | 102 | 102 | 102 |
| 3 | 107 | 107 | 107 |
| 4 | 94 | 107 | 107 |
| 5 | 95 | 107 | 107 |
| 6 | 96 | 107 | 107 |
| 7 | 92 | 107 | 107 |
| 8 | 150 | 150 | 150 |
场景适配
针对传感器接收的无序时间批次数据,通过cummax()得到历史最大时间后,可轻松检测出时间早于该最大值的批次(即当前行时间 < 历史最大时间的批次)。
内容的提问来源于stack exchange,提问作者an ch
相关产品推荐
相关产品推荐

