在Python中将年度累计数据转换为月度绝对值

2024-08-30 05:05:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个年度累计数据帧,如下所示:

       date      v1      v2
0   2019-10  109.23  126.17
1   2019-09  108.90  121.07
2   2019-08   95.96   85.40
3   2019-07   91.30   82.92
4   2019-06   80.19   26.04
5   2019-05   65.98   18.58
6   2019-04   38.80    9.87
7   2019-03    3.01    2.51
8   2019-02    3.01    2.49
9   2018-12  221.31  249.87
10  2018-11  215.59  137.92
11  2018-10  195.16  110.69
12  2018-09  160.45  101.15
13  2018-08  124.70   75.57
14  2018-07  122.98   52.48
15  2018-06   73.46   34.82
16  2018-05   42.22   34.61
17  2018-04    9.94   28.52
18  2018-03    4.07   28.52
19  2018-02    2.04   21.84

只是想知道是否有可能为每年的数据生成cum_v1cum_v2。你知道吗

计算的逻辑是:2019-10cum_v1的值通过2019-10中的值(取初始值)减去2019-09中的值来计算,直到2019-02cum_v1的值与v1保持相同,并为2019-01中的所有值设置0。同样的逻辑适用于2018年。你知道吗

所需输出如下:

       date      v1  cum_v1      v2  cum_v2
0   2019-10  109.23    0.33  126.17    5.10
1   2019-09  108.90   12.94  121.07   35.67
2   2019-08   95.96    4.66   85.40    2.48
3   2019-07   91.30   11.11   82.92   56.88
4   2019-06   80.19   14.21   26.04    7.46
5   2019-05   65.98   27.18   18.58    8.71
6   2019-04   38.80   35.79    9.87    7.36
7   2019-03    3.01    0.00    2.51    0.02
8   2019-02    3.01    3.01    2.49    2.49
9   2019-01       0       0       0       0
10  2018-12  221.31    5.72  249.87  111.95
11  2018-11  215.59   20.43  137.92   27.23
12  2018-10  195.16   34.71  110.69    9.54
13  2018-09  160.45   35.75  101.15   25.58
14  2018-08  124.70    1.72   75.57   23.09
15  2018-07  122.98   49.52   52.48   17.66
16  2018-06   73.46   31.24   34.82    0.21
17  2018-05   42.22   32.28   34.61    6.09
18  2018-04    9.94    5.87   28.52    0.00
19  2018-03    4.07    2.03   28.52    6.68
20  2018-02    2.04    2.04   21.84   21.84
21  2018-01       0       0       0       0

Tags: 数据date逻辑v2v1年度cum
2条回答

使用^{}^{}以及列表中的列,用^{}替换上一个缺少的值,用^{}添加前缀,用^{}最后一个连接到原始:

df['date'] = pd.to_datetime(df['date']).dt.to_period('m')

cols = ['v1','v2']
df = df.join(df.groupby(df['date'].dt.year)[cols].diff(-1).fillna(df[cols]).add_prefix('cum'))
print (df)
       date      v1      v2  cumv1   cumv2
0   2019-10  109.23  126.17   0.33    5.10
1   2019-09  108.90  121.07  12.94   35.67
2   2019-08   95.96   85.40   4.66    2.48
3   2019-07   91.30   82.92  11.11   56.88
4   2019-06   80.19   26.04  14.21    7.46
5   2019-05   65.98   18.58  27.18    8.71
6   2019-04   38.80    9.87  35.79    7.36
7   2019-03    3.01    2.51   0.00    0.02
8   2019-02    3.01    2.49   3.01    2.49
9   2018-12  221.31  249.87   5.72  111.95
10  2018-11  215.59  137.92  20.43   27.23
11  2018-10  195.16  110.69  34.71    9.54
12  2018-09  160.45  101.15  35.75   25.58
13  2018-08  124.70   75.57   1.72   23.09
14  2018-07  122.98   52.48  49.52   17.66
15  2018-06   73.46   34.82  31.24    0.21
16  2018-05   42.22   34.61  32.28    6.09
17  2018-04    9.94   28.52   5.87    0.00
18  2018-03    4.07   28.52   2.03    6.68
19  2018-02    2.04   21.84   2.04   21.84

编辑:

df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date').resample('MS').sum()

cols = ['v1','v2']
cols = ['v1','v2']
df = (df.join(df.groupby(df.index.year)[cols].diff(-1).fillna(df[cols])
                .add_prefix('cum')).to_period('m'))

print (df)
             v1      v2   cumv1   cumv2
date                                   
2018-02    2.04   21.84   -2.03   -6.68
2018-03    4.07   28.52   -5.87    0.00
2018-04    9.94   28.52  -32.28   -6.09
2018-05   42.22   34.61  -31.24   -0.21
2018-06   73.46   34.82  -49.52  -17.66
2018-07  122.98   52.48   -1.72  -23.09
2018-08  124.70   75.57  -35.75  -25.58
2018-09  160.45  101.15  -34.71   -9.54
2018-10  195.16  110.69  -20.43  -27.23
2018-11  215.59  137.92   -5.72 -111.95
2018-12  221.31  249.87  221.31  249.87
2019-01    0.00    0.00   -3.01   -2.49
2019-02    3.01    2.49    0.00   -0.02
2019-03    3.01    2.51  -35.79   -7.36
2019-04   38.80    9.87  -27.18   -8.71
2019-05   65.98   18.58  -14.21   -7.46
2019-06   80.19   26.04  -11.11  -56.88
2019-07   91.30   82.92   -4.66   -2.48
2019-08   95.96   85.40  -12.94  -35.67
2019-09  108.90  121.07   -0.33   -5.10
2019-10  109.23  126.17  109.23  126.17

pandas.Groupbydiff一起使用:

df[['cum_v1', 'cum_v2']] = df.groupby(df['date'].str[:4]).diff(-1).fillna(df[['v1', 'v2']])
print(df)

输出:

       date      v1      v2  cum_v1  cum_v2
0   2019-10  109.23  126.17    0.33    5.10
1   2019-09  108.90  121.07   12.94   35.67
2   2019-08   95.96   85.40    4.66    2.48
3   2019-07   91.30   82.92   11.11   56.88
4   2019-06   80.19   26.04   14.21    7.46
5   2019-05   65.98   18.58   27.18    8.71
6   2019-04   38.80    9.87   35.79    7.36
7   2019-03    3.01    2.51    0.00    0.02
8   2019-02    3.01    2.49    3.01    2.49
9   2018-12  221.31  249.87    5.72  111.95
10  2018-11  215.59  137.92   20.43   27.23
11  2018-10  195.16  110.69   34.71    9.54
12  2018-09  160.45  101.15   35.75   25.58
13  2018-08  124.70   75.57    1.72   23.09
14  2018-07  122.98   52.48   49.52   17.66
15  2018-06   73.46   34.82   31.24    0.21
16  2018-05   42.22   34.61   32.28    6.09
17  2018-04    9.94   28.52    5.87    0.00
18  2018-03    4.07   28.52    2.03    6.68
19  2018-02    2.04   21.84    2.04   21.84

相关问题 更多 >