我有一个数据框,用于汇总特定月份客户在其帐户中拥有的$金额。如果客户没有钱,则金额仅为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
答案 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