熊猫:动态计算流失的发生地点

时间:2017-02-08 13:14:57

标签: python pandas

我有一个数据框,其中每一行都是公司,列是每月收入,就像这样。

import pandas as pd
from io import StringIO

data='''
Company   jan  feb  mar  apr  may  jun  jul  aug  sep  oct  nov  dec  CHURN
Dell      nan  nan  nan  600  550  620  nan  nan  300  100  200  50
Sony      740  720  780  700  250  140  20   nan  nan  nan  nan  nan
Toshiba   nan  nan  nan  nan  400  550  nan  500  nan  40   50   nan
Apple     nan  300  350  300  400  500  nan  nan  nan  nan  nan  nan
Acer      150  200  250  200  50   50   40   35   30   20   10   nan'''

df=pd.read_csv(StringIO(data),delimiter='\s+')

我需要计算这些公司(部分)流失的时间,如果他们这样做的话。我的定义如下。

  1. 必须至少连续4个月的收入。
  2. 然后2个月,收入必须保持在特定点以下。
  3. 这个特定点是该时期平均收入的50% 在此之前,从这4个月开始。
  4. 流失的价值将是收入首次降至低于的月份    那50%点。
  5. 结果将如下所示。

    Company   jan  feb  mar  apr  may  jun  jul  aug  sep  oct  nov  dec  CHURN
    --------------------------------------------------------------------------------
    Dell      nan  nan  nan  600  550  620  nan  nan  300  100  200  50   
    Sony      740  720  780  700  250  140  20   nan  nan  nan  nan  nan  may
    Toshiba   nan  nan  nan  nan  400  550  nan  500  nan  40   50   nan  
    Apple     nan  300  350  300  400  500  nan  nan  nan  nan  nan  nan  jul
    Acer      150  200  250  200  50   50   40   35   30   20   10   nan  may
    

    编辑: 我要去iloc[]并嵌套for循环

    firstrevenue=0
    for row in range(0,len(df.index)-1):
        for col in range(1,12):
            if df.iloc[row,col].values > 0:
                if firstrevenue = 0:
                    firstrevenue=col
    

    但罗马佩卡尔想出了一些更好的东西。问题已解决。

1 个答案:

答案 0 :(得分:1)

不确定您是否可以使用pandas.Series.rolling轻松完成,但您可以使用自定义功能和pandas.DataFrame.apply完成此操作:

>>> def worker(x):
...     for i in range(1, len(x) - 6):
...         d = x[i:i+4]
...         if not d.isnull().values.any():
...             if x[i+4:i+6].fillna(0).max() < d.mean()/2:
...                 return i+4
... 
>>> df.apply(worker, axis=1)
0    NaN
1    5.0
2    NaN
3    7.0
4    5.0