首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据年变化量和Pandas上一年的值计算多列的当前值

根据年变化量和Pandas上一年的值计算多列的当前值
EN

Stack Overflow用户
提问于 2021-11-05 06:52:27
回答 1查看 33关注 0票数 2

给定如下的df

代码语言:javascript
运行
复制
df = [{'date': '1980-01-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 190.3},
 {'date': '1980-02-29 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 174.9},
 {'date': '1980-03-31 00:00:00',
  'yoy_1': 0.001470155,
  'yoy_2': 0.002116268,
  'value': 163.2},
 {'date': '1980-04-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 168.4},
 {'date': '1980-05-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 168.6},
 {'date': '1980-06-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 168.2},
 {'date': '1980-07-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 163.5},
 {'date': '1980-08-31 00:00:00',
  'yoy_1': 0.019327965,
  'yoy_2': 0.002116268,
  'value': 161.6},
 {'date': '1980-09-30 00:00:00',
  'yoy_1': 0.001203869,
  'yoy_2': 0.002116268,
  'value': 172.9},
 {'date': '1980-10-31 00:00:00',
  'yoy_1': 0.101000481,
  'yoy_2': 0.222560596,
  'value': 166.5},
 {'date': '1980-11-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 175.2},
 {'date': '1980-12-31 00:00:00',
  'yoy_1': 0.102218761,
  'yoy_2': 0.002116268,
  'value': 197.7},
 {'date': '1981-01-31 00:00:00',
  'yoy_1': 0.001521527,
  'yoy_2': 0.002116268,
  'value': 212.1},
 {'date': '1981-02-28 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.234524059,
  'value': 177.9},
 {'date': '1981-03-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 182.9},
 {'date': '1981-04-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 184.2},
 {'date': '1981-05-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 184.0},
 {'date': '1981-06-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 182.4},
 {'date': '1981-07-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 175.6},
 {'date': '1981-08-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 172.0},
 {'date': '1981-09-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 184.9},
 {'date': '1981-10-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 184.7},
 {'date': '1981-11-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 195.1},
 {'date': '1981-12-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.086862869,
  'value': 224.8},
 {'date': '1982-01-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.226102276,
  'value': 233.6},
 {'date': '1982-02-28 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 182.0},
 {'date': '1982-03-31 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 206.6},
 {'date': '1982-04-30 00:00:00',
  'yoy_1': 0.001521525,
  'yoy_2': 0.002116268,
  'value': 202.2}]

输出:

代码语言:javascript
运行
复制
                   date     yoy_1     yoy_2  value
0   1980-01-31 00:00:00  0.001522  0.002116  190.3
1   1980-02-29 00:00:00  0.001522  0.002116  174.9
2   1980-03-31 00:00:00  0.001470  0.002116  163.2
3   1980-04-30 00:00:00  0.001522  0.002116  168.4
4   1980-05-31 00:00:00  0.001522  0.002116  168.6
5   1980-06-30 00:00:00  0.001522  0.002116  168.2
6   1980-07-31 00:00:00  0.001522  0.002116  163.5
7   1980-08-31 00:00:00  0.019328  0.002116  161.6
8   1980-09-30 00:00:00  0.001204  0.002116  172.9
9   1980-10-31 00:00:00  0.101000  0.222561  166.5
10  1980-11-30 00:00:00  0.001522  0.002116  175.2
11  1980-12-31 00:00:00  0.102219  0.002116  197.7
12  1981-01-31 00:00:00  0.001522  0.002116  212.1
13  1981-02-28 00:00:00  0.001522  0.234524  177.9
14  1981-03-31 00:00:00  0.001522  0.002116  182.9
15  1981-04-30 00:00:00  0.001522  0.002116  184.2
16  1981-05-31 00:00:00  0.001522  0.002116  184.0
17  1981-06-30 00:00:00  0.001522  0.002116  182.4
18  1981-07-31 00:00:00  0.001522  0.002116  175.6
19  1981-08-31 00:00:00  0.001522  0.002116  172.0
20  1981-09-30 00:00:00  0.001522  0.002116  184.9
21  1981-10-31 00:00:00  0.001522  0.002116  184.7
22  1981-11-30 00:00:00  0.001522  0.002116  195.1
23  1981-12-31 00:00:00  0.001522  0.086863  224.8
24  1982-01-31 00:00:00  0.001522  0.226102  233.6
25  1982-02-28 00:00:00  0.001522  0.002116  182.0
26  1982-03-31 00:00:00  0.001522  0.002116  206.6
27  1982-04-30 00:00:00  0.001522  0.002116  202.2

我希望基于列计算实值从yoyvalue开始,使用下面的代码我可以做到,但它不简洁。

例如,对于1981-01-31 00:00:00yoy_1_value将由(1 + yoy_1) * value from 1980-01-31 00:00:00计算;yoy_2_value将由(1 + yoy_2) * value from 1980-01-31 00:00:00计算。

代码语言:javascript
运行
复制
df['yoy_1_value'] = (1 + df['yoy_1']).mul(df['value'].shift(12))
df['yoy_2_value'] = (1 + df['yoy_2']).mul(df['value'].shift(12))

我如何改进它应用以yoy_开头的多个列名?谢谢。

代码语言:javascript
运行
复制
def cal_current_values(x):
    return (1 + x).mul(df['value'].shift(12))

要筛选yoy列:

代码语言:javascript
运行
复制
yoy_cols = [col for col in df if col.startswith('yoy')]
yoy_cols

预期结果:

代码语言:javascript
运行
复制
                   date     yoy_1     yoy_2  value  yoy_1_value  yoy_2_value
0   1980-01-31 00:00:00  0.001522  0.002116  190.3          NaN          NaN
1   1980-02-29 00:00:00  0.001522  0.002116  174.9          NaN          NaN
2   1980-03-31 00:00:00  0.001470  0.002116  163.2          NaN          NaN
3   1980-04-30 00:00:00  0.001522  0.002116  168.4          NaN          NaN
4   1980-05-31 00:00:00  0.001522  0.002116  168.6          NaN          NaN
5   1980-06-30 00:00:00  0.001522  0.002116  168.2          NaN          NaN
6   1980-07-31 00:00:00  0.001522  0.002116  163.5          NaN          NaN
7   1980-08-31 00:00:00  0.019328  0.002116  161.6          NaN          NaN
8   1980-09-30 00:00:00  0.001204  0.002116  172.9          NaN          NaN
9   1980-10-31 00:00:00  0.101000  0.222561  166.5          NaN          NaN
10  1980-11-30 00:00:00  0.001522  0.002116  175.2          NaN          NaN
11  1980-12-31 00:00:00  0.102219  0.002116  197.7          NaN          NaN
12  1981-01-31 00:00:00  0.001522  0.002116  212.1   190.589547   190.702726
13  1981-02-28 00:00:00  0.001522  0.234524  177.9   175.166115   215.918258
14  1981-03-31 00:00:00  0.001522  0.002116  182.9   163.448313   163.545375
15  1981-04-30 00:00:00  0.001522  0.002116  184.2   168.656225   168.756380
16  1981-05-31 00:00:00  0.001522  0.002116  184.0   168.856529   168.956803
17  1981-06-30 00:00:00  0.001522  0.002116  182.4   168.455921   168.555956
18  1981-07-31 00:00:00  0.001522  0.002116  175.6   163.748769   163.846010
19  1981-08-31 00:00:00  0.001522  0.002116  172.0   161.845878   161.941989
20  1981-09-30 00:00:00  0.001522  0.002116  184.9   173.163072   173.265903
21  1981-10-31 00:00:00  0.001522  0.002116  184.7   166.753334   166.852359
22  1981-11-30 00:00:00  0.001522  0.002116  195.1   175.466571   175.570770
23  1981-12-31 00:00:00  0.001522  0.086863  224.8   198.000805   214.872789
24  1982-01-31 00:00:00  0.001522  0.226102  233.6   212.422715   260.056293
25  1982-02-28 00:00:00  0.001522  0.002116  182.0   178.170679   178.276484
26  1982-03-31 00:00:00  0.001522  0.002116  206.6   183.178287   183.287065
27  1982-04-30 00:00:00  0.001522  0.002116  202.2   184.480265   184.589817
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 07:16:52

使用带有^DataFrame.filter作为字符串的开头,添加了axis=0用于更正multiple by column value

代码语言:javascript
运行
复制
df = df.filter(regex='^yoy_').add(1).mul(df['value'].shift(12), axis=0)

print (df)
         yoy_1       yoy_2
0          NaN         NaN
1          NaN         NaN
2          NaN         NaN
3          NaN         NaN
4          NaN         NaN
5          NaN         NaN
6          NaN         NaN
7          NaN         NaN
8          NaN         NaN
9          NaN         NaN
10         NaN         NaN
11         NaN         NaN
12  190.589547  190.702726
13  175.166115  215.918258
14  163.448313  163.545375
15  168.656225  168.756380
16  168.856529  168.956803
17  168.455921  168.555956
18  163.748769  163.846010
19  161.845878  161.941989
20  173.163072  173.265903
21  166.753334  166.852359
22  175.466571  175.570770
23  198.000805  214.872789
24  212.422715  260.056293
25  178.170679  178.276484
26  183.178287  183.287065
27  184.480265  184.589817

添加到原始文件:

代码语言:javascript
运行
复制
df = df.join(df.filter(regex='^yoy_').add(1).mul(df['value'].shift(12), axis=0).add_suffix('_values'))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69849533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档