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

时间:2019-12-12 09:05:03

标签: python python-3.x pandas dataframe

说我有一个每年累计数据帧,如下所示:

       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

计算的逻辑是:cum_v12019-10的值由2019-10中的值(取初始金额)减去2019-09中的值,直到{{1 }}在2019-02中与cum_v1保持相同,并为v1中的所有值设置02019-01年的逻辑相同。

所需的输出将如下所示:

2018

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在列表中的列中使用DataFrameGroupBy.diffSeries.dt.year,用DataFrame.fillna替换最后丢失的值,用DataFrame.add_prefix添加前缀,最后用{{3 }}:

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