我有一个数据框,该框使用二进制指标来反映客户在特定月份内是否还活着。如果客户是有生命的,则为1,否则为0。数据帧如下所示:
ax[1, 1].tick_params(which="both", bottom=True)
当客户首次上线时,他们在特定月份获得1。因此,当特定客户的头一个数字是1时,这就是他们“新”的月份。
我想在数据框的末尾添加一列,以计算“新”客户的数量。
我认为最有效的方法是将第0行到第i行的值相加,然后计算总和等于1的次数。当该总和大于1时,客户将居住2个月,并且在给定的月份中不是新客户。
我已经使用这种方法在excel中进行了计算,但是不清楚如何在Python中进行此操作。
结果数据框如下所示:
Customer A B C D E F G H I J
11/30/2015 1 0 1 0 0 1 1 0 0 0
12/31/2015 0 1 0 1 0 1 1 0 0 1
1/31/2016 0 0 0 0 0 1 1 0 0 1
2/29/2016 1 1 1 1 1 1 0 1 1 1
3/31/2016 1 1 0 1 1 0 1 1 0 1
4/30/2016 0 1 1 1 0 1 1 1 0 1
5/31/2016 1 1 1 1 1 1 0 1 0 1
答案 0 :(得分:1)
您可以应用一个累积最大值,该最大值可以转发每列的“ 1”并求和轴1中的所有列,并计算差值。 第一个值是null,您可以通过将第一行加起来来填充
df1 = df[df.columns.difference(['Customer'])]
df['New_customers'] = df1.cummax().sum(1).diff().fillna(df1.loc[0].sum())
出局:
Customer A B C D E F G H I J New_customers
0 11/30/2015 1 0 1 0 0 1 1 0 0 0 4.0
1 12/31/2015 0 1 0 1 0 1 1 0 0 1 3.0
2 1/31/2016 0 0 0 0 0 1 1 0 0 1 0.0
3 2/29/2016 1 1 1 1 1 1 0 1 1 1 3.0
4 3/31/2016 1 1 0 1 1 0 1 1 0 1 0.0
5 4/30/2016 0 1 1 1 0 1 1 1 0 1 0.0
6 5/31/2016 1 1 1 1 1 1 0 1 0 1 0.0
答案 1 :(得分:1)
通过定义自定义new
函数并使用DataFrame.expanding
。我不确定为什么expanding().apply(new)
的结果需要从float
强制转换为int
,但是嘿,它的工作原理是
def new(column):
return column[-1] and not any(column[:-1])
result = df.expanding().apply(new).sum(axis=1).astype(int)
print(result)
Out:
11/30/2015 4
12/31/2015 3
1/31/2016 0
2/29/2016 3
3/31/2016 0
4/30/2016 0
5/31/2016 0
dtype: int32