Python 计算客户在时间序列中连续几个月的平均未偿金额

Python 计算客户在时间序列中连续几个月的平均未偿金额,python,pandas,Python,Pandas,我有一个数据框,它将客户在特定月份账户中的美元金额相加。如果客户没有钱,金额仅为0。数据框如下所示: Customer A B C D E F 11/30/2015 0 1,000 0 0 5,000 0 12/31/2015 2,133 1,000 0 3,000 5,000 2,000 1/31/2016 2,133 0

我有一个数据框,它将客户在特定月份账户中的美元金额相加。如果客户没有钱,金额仅为0。数据框如下所示:

Customer    A       B       C       D       E        F   
11/30/2015  0       1,000   0       0       5,000    0   
12/31/2015  2,133   1,000   0       3,000   5,000    2,000
1/31/2016   2,133   0       0       3,000   5,000    2,000
2/29/2016   2,133   2,000   4,000   3,000   5,000    2,000
3/31/2016   2,133   2,000   4,000   0       10,000   2,000
4/30/2016   0       2,000   4,000   0       10,000   0   
5/31/2016   0       2,000   4,000   0       10,000   0  
当客户处于活动状态时,他们的账户中有特定月份的名义金额。同样,如果他们生活在下一个月(或任何一个月),他们也有一个该月的名义金额

我想在dataframe的末尾添加一列,该列计算同一个月内客户帐户中的平均金额,但仅适用于前一个月还活跃的客户

我正在尝试对客户保留率进行一些分析,因此我需要本月内客户的平均未付金额,以及前一个月居住的客户的平均未付金额

生成的数据帧如下所示:

Customer    A       B       C       D       E        F       Avg Outstanding consecutive Months
11/30/2015  0       1,000   0       0       5,000    0       0
12/31/2015  2,000   1,000   0       3,000   5,000    2,000   3,000
1/31/2016   2,000   0       0       3,000   5,000    2,000   3,000
2/29/2016   2,000   2,000   4,000   3,000   5,000    2,000   3,000
3/31/2016   2,000   2,000   4,000   0       10,000   2,000   4,000
4/30/2016   0       2,000   4,000   0       10,000   0       5,333
5/31/2016   0       2,000   4,000   0       10,000   0       5,333

首先,通过删除“,”并转换为整数,将数据转换为python可读形式

df.set_index(['Customer'],inplace=True)
df = pd.DataFrame(df.apply(' '.join,axis=1).str.replace(',', '').str.split(expand=False).tolist(),columns=df.columns,index=df.index).astype(int)
现在检查条件值是否等于0并移动数据帧,现在您可以取布尔数据帧的负数,该值将仅具有活动示例

df  = df[~df.eq(0).shift().fillna(False)].fillna(0)
输出: 屏蔽数据帧

             A    B    C      D    E     F
Customer                        
11/30/2015  0.0 1000.0  0.0 0.0 5000    0.0
12/31/2015  0.0 1000.0  0.0 0.0 5000    0.0
1/31/2016   2133.0  0.0 0.0 3000.0  5000    2000.0
2/29/2016   2133.0  0.0 0.0 3000.0  5000    2000.0
3/31/2016   2133.0  2000.0  4000.0  0.0 10000   2000.0
4/30/2016   0.0 2000.0  4000.0  0.0 10000   0.0
5/31/2016   0.0 2000.0  4000.0  0.0 10000   0.0
现在,您可以通过axis one仅使用活动值从数据帧中提取平均值

df1['Avg Outstanding'] = df1.apply(lambda x: sum(x)/x.ne(0).sum(),1).astype(int)
输出:


Customer
列是数据帧的索引吗?左侧的日期列是索引。客户只参考了栏目的标签,谢谢回复。这几乎是正确的,但我只需要计算上个月的平均值。也就是说,对于2016年1月31日,我只计算e列的平均值,因为它是2015年12月31日唯一存在的列。同样,对于2016年2月29日,我会计算A、D、E、F列的平均值,因为每个列在2016年1月31日都有一个值,但您的预期输出仅排除了0值前一天的值。我想你看到的是蒙面数据框@briainodonell我不确定你的意思@nagaKiran。例如,2016年1月31日的预期产量为5000。在您的答案中,同一行的输出为3033
              A       B       C     D        E      F   Avg Outstanding
Customer                            
11/30/2015  0.0     1000.0   0.0    0.0     5000    0.0     3000
12/31/2015  0.0     1000.0   0.0    0.0     5000    0.0     3000
1/31/2016   2133.0  0.0      0.0   3000.0   5000   2000.0   3033
2/29/2016   2133.0  0.0      0.0   3000.0   5000   2000.0   3033
3/31/2016   2133.0  2000.0  4000.0  0.0    10000   2000.0   4026
4/30/2016   0.0     2000.0  4000.0  0.0    10000    0.0     5333
5/31/2016   0.0     2000.0  4000.0  0.0    10000    0.0     5333