如何为Pandas DataFrame创建含Trend列前序值列表的新列
给Pandas DataFrame新增前序Trend值列表列
需求说明
为已创建的df新增一列ArrayToBeMade,该列每个元素是包含当前行之前3个Trend列值的列表,不足3个前序值时用NaN补全列表长度。
解决方案代码
import pandas as pd import numpy as np # 原DataFrame创建代码 ds = {'Trend' : [1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3, 4,4,4,4,4, 5,5,5,5,5], 'Cycle' : [ 14,88,50,119,107, 32,111,41,88,38, 37,72,79,98,69, 62,38,86,26,30, 52,91,122,90,127 ] } df = pd.DataFrame(data=ds) # 生成前序Trend列并合并为列表 # 获取前1、前2、前3行的Trend值 df['prev1'] = df['Trend'].shift(1) df['prev2'] = df['Trend'].shift(2) df['prev3'] = df['Trend'].shift(3) # 将三列按行转为列表,作为新列 df['ArrayToBeMade'] = df[['prev3', 'prev2', 'prev1']].values.tolist() # 删除临时生成的辅助列 df = df.drop(columns=['prev1', 'prev2', 'prev3'])
结果示例
处理后的DataFrame前6行如下:
Trend Cycle ArrayToBeMade 0 1 14 [NaN, NaN, NaN] 1 1 88 [NaN, NaN, 1.0] 2 1 50 [NaN, 1.0, 1.0] 3 1 119 [1.0, 1.0, 1.0] 4 1 107 [1.0, 1.0, 1.0] 5 2 32 [1.0, 1.0, 1.0]
自定义调整
- 如果希望不足3个前序值时用其他值(比如0)填充,可在转列表前补全:
df['ArrayToBeMade'] = df[['prev3', 'prev2', 'prev1']].fillna(0).values.tolist() - 如果需要列表内元素顺序为最近的前序值在前,调整列顺序即可:
df['ArrayToBeMade'] = df[['prev1', 'prev2', 'prev3']].values.tolist()
内容的提问来源于stack exchange,提问作者Giampaolo Levorato
相关产品推荐
相关产品推荐

