如何用Pandas一行代码按指定周期为DataFrame列生成.diff衍生列?
一行代码实现Pandas多特征多周期.diff衍生列生成
需要为DataFrame指定特征按不同周期调用diff()生成衍生列(如foo_diff1、bar_diff3这类命名),要求一行代码完成。现有基于pd.concat()+map()的代码无法遍历周期列表,需修正。
示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ "Category":["A"]*10+["B"]*50+["C"]*15+["D"]*100, "foo":[np.random.random_sample() for i in range(175)], "bar":[np.random.random_sample() for i in range(175)] }) dict_diff={"foo":[1,2],"bar":[3,4]}
原代码问题分析
原代码直接将字典值(周期列表)传入diff(periods=...),但diff()的periods参数仅接受单个数值,无法处理列表,因此无法遍历每个周期生成对应衍生列。
修正后的一行代码
pd.concat(map(lambda x: df[x[0]].diff(periods=x[1]).rename(f"{x[0]}_diff{x[1]}"), ((col, period) for col, periods in dict_diff.items() for period in periods)), axis=1)
代码说明
- 用生成器表达式
((col, period) for col, periods in dict_diff.items() for period in periods)将原字典的键值对展开为**(列名, 单个周期)**的元组序列,例如把{"foo":[1,2]}拆成("foo",1)、("foo",2)两组数据 - 再通过
map()对每个元组调用diff()并按规则命名列,最后用pd.concat()横向拼接所有衍生列
运行代码后,会生成foo_diff1、foo_diff2、bar_diff3、bar_diff4四个衍生列,每个列对应原特征指定周期的差分结果。
内容的提问来源于stack exchange,提问作者PeCaDe
相关产品推荐
相关产品推荐

