返回时间段之间的绝对差异

Emm*_*Emm 3 python pandas

我想计算每个销售代理不同时间段之间价值的绝对差异。

所以从这个数据集:

Report month    ID Vendedor   sum     count   Rental Charge
 2018-07-01       803621.0   780.81     42       4
 2018-07-01       900000.0   100.90     20       5
 2018-08-01       803621.0   1132.71    77       3
 2018-08-01       900000.0   1000.10    10       2  
Run Code Online (Sandbox Code Playgroud)

我想得到这样的结果:

Report month    ID Vendedor   sum     count   Rental Charge     Diff
 2018-07-01       803621.0   780.81     42         4             0  
 2018-08-01       803621.0   1132.71    77         3           351.90
 2018-07-01       900000.0   100.90     20         5             0
 2018-08-01       900000.0   1000.10    10         2           899.20
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

two['pct_change'] = one.groupby(['Report month','ID Vendedor'])['sum'].pct_change() 
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果:

Report month    ID Vendedor   sum     count   Rental Charge     Pct_change
 2018-07-01       803621.0   780.81     42         4               NaN  
 2018-08-01       803621.0   1132.71    77         3               NaN
 2018-07-01       900000.0   100.90     20         5               NaN
 2018-08-01       900000.0   1000.10    10         2               NaN
Run Code Online (Sandbox Code Playgroud)

我知道 pct_change 返回百分比变化,但我打算将此百分比转换为绝对数字

jez*_*ael 5

使用DataFrameGroupBy.diffDataFrame.sort_values

#if necessary
#one = one.sort_values('Report month')
one['diff'] = one.groupby('ID Vendedor')['sum'].diff().fillna(0)
one = one.sort_values('ID Vendedor')
print (one)
  Report month  ID Vendedor      sum  count  Rental Charge   diff
0   2018-07-01     803621.0   780.81     42              4    0.0
2   2018-08-01     803621.0  1132.71     77              3  351.9
1   2018-07-01     900000.0   100.90     20              5    0.0
3   2018-08-01     900000.0  1000.10     10              2  899.2
Run Code Online (Sandbox Code Playgroud)


ans*_*sev 5

使用DataFrame.sort_values 排序数据框,然后我们可以使用DataFrame.assignGroupBy.diff创建Diff列:

new_df = (df.sort_values(['ID Vendedor','Report month'])
            .assign(Diff = lambda x: x.groupby('ID Vendedor')['sum']
                                       .diff().fillna(0))
         )
print(new_df)
  Report month  ID Vendedor      sum  count  Rental Charge   Diff
0   2018-07-01     803621.0   780.81     42              4    0.0
2   2018-08-01     803621.0  1132.71     77              3  351.9
1   2018-07-01     900000.0   100.90     20              5    0.0
3   2018-08-01     900000.0  1000.10     10              2  899.2
Run Code Online (Sandbox Code Playgroud)

我们还可以使用GroupBy.shiftSeries.sub

(df.sort_values(['ID Vendedor','Report month'])
   .assign(Diff = lambda x: x['sum'].sub(x.groupby('ID Vendedor')['sum']
                                          .shift())
                                    .fillna(0)))
Run Code Online (Sandbox Code Playgroud)