计算按时间序列连续居住的客户的未偿还平均金额

时间:2018-09-20 12:13:58

标签: 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       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  

有客户时,他们在特定月份的帐户中有名义金额。同样,如果他们在下个月(或任何一个月)居住,则该月也有名义金额。

我想在数据框的末尾添加一列,该列计算当月客户帐户中的平均金额,但仅适用于上个月也住过的客户

我正在尝试对客户保留率进行一些分析,因此,对于上个月的客户,我还需要本月对客户的平均未偿还金额。

结果数据框如下所示:

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

1 个答案:

答案 0 :(得分:0)

首先通过删除','并将其转换为整数

将数据转换为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

现在,您可以仅通过实时值从第一个轴中取出数据帧中的平均值

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

出局:

              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