Pandas实现:为DataFrame新增列标记最新时间戳值的历史最高起始时间
解决方案:为Pandas透视表新增历史最高标记列
针对你以日期为列、指标为行的透视表需求,我们可以通过自定义函数结合apply方法快速实现最新日期的历史最高标记功能。
步骤1:准备数据与基础环境
首先导入依赖并创建示例DataFrame:
import pandas as pd from pandas import Timestamp # 示例数据 data_dict = { Timestamp('2010-01-01 00:00:00'): {'A': 12, 'B': 10}, Timestamp('2010-02-01 00:00:00'): {'A': 5, 'B': 14}, Timestamp('2010-03-01 00:00:00'): {'A': 2, 'B': 8}, Timestamp('2010-04-01 00:00:00'): {'A': 11, 'B': 16} } # 创建透视表格式的DataFrame(行=指标,列=日期) df = pd.DataFrame(data=data_dict) # 确保日期列按升序排列(如果你的透视表未排序) df = df.sort_index(axis=1)
步骤2:定义标记逻辑函数
编写自定义函数处理每一行(单个指标)的历史最高判断:
def generate_high_label(row, latest_date_col): current_value = row[latest_date_col] # 获取该行的日期序列与对应数值 date_sequence = row.index value_sequence = row.values # 判断当前值是否为历史新高 if current_value == value_sequence.max(): return "record" else: # 找到最后一个数值高于当前值的位置 higher_positions = (value_sequence > current_value).nonzero()[0] last_higher_idx = higher_positions[-1] # 取该位置的下一个日期作为起始点 start_date = date_sequence[last_higher_idx + 1] return f"自{start_date.strftime('%Y-%m-%d %H:%M:%S')}以来最高"
步骤3:应用函数生成新列
获取最新日期列,将函数应用到每一行生成标记列:
# 获取最新日期对应的列名(最右侧列) latest_col = df.columns[-1] # 生成"最高标记"列 df['最高标记'] = df.apply(generate_high_label, args=(latest_col,), axis=1)
最终结果
执行后DataFrame将新增标记列,符合预期需求:
2010-01-01 00:00:00 2010-02-01 00:00:00 2010-03-01 00:00:00 2010-04-01 00:00:00 最高标记 A 12 5 2 11 自2010-02-01 00:00:00以来最高 B 10 14 8 16 record
关键说明
- 若你的透视表日期列未按时间排序,必须先执行
df.sort_index(axis=1)确保日期顺序正确,否则标记逻辑会出错 - 函数中通过
nonzero()定位最后一个高于当前值的历史日期,确保起始点的准确性 - 日期格式化可根据需求调整
strftime的参数,比如简化为%Y-%m-%d
内容的提问来源于stack exchange,提问作者Robert Tuttle
相关产品推荐
相关产品推荐

