Python 熊猫:动态计算搅动发生的位置

Python 熊猫:动态计算搅动发生的位置,python,pandas,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

我有一个数据框,其中每一行是一家公司,列是每月收入,如下图所示

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+')
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
我需要计算这些公司(部分)的流失时间,如果他们这样做的话。我的定义如下

  • 必须有至少连续4个月的收入
  • 然后在2个月内,收入必须保持在某一特定点以下
  • 这一点是该时期平均收入的50% 在此之前,从连续4个月开始
  • 客户流失的价值将是收入首次降至以下的月份 那是50%的分数 结果如下所示

    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+')
    
    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
    

    但是罗曼·佩卡尔想出了更好的办法。问题已解决。

    不确定是否可以轻松使用,但您肯定可以使用自定义功能和:

    def工作者(x): ... 对于范围(1,len(x)-6)内的i: ... d=x[i:i+4] ... 如果不是d.isnull().values.any(): ... 如果x[i+4:i+6].fillna(0.max()>>df.apply(工人,轴=1) 0南 1 5.0 2楠 3 7.0 4 5.0
    请提供您的任何尝试。您能提供写出的数据框吗?我已编辑。这就是你的意思吗@不是机器人对不起,我还在努力。我有一堆伪代码,但在这一点上,我没有得到比ItErrors()更多的东西。但仍在努力。@Duudsrednaz是您公司的专栏取代了索引吗?@Charles Morris不是。谢谢。我知道一定会有更好的东西,而不仅仅是在所有东西之间循环。我将研究
    系列。滚动
    。如果更快,我会更新。