Python 计算客户在时间序列中连续几个月的平均未偿金额
我有一个数据框,它将客户在特定月份账户中的美元金额相加。如果客户没有钱,金额仅为0。数据框如下所示: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
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