代码之家  ›  专栏  ›  技术社区  ›  Umar.H

熊猫找到最早出现的语句并设置为starter

  •  2
  • Umar.H  · 技术社区  · 6 年前

    考虑下面的DF

      data = {'Name' : ['John','John','Lucy','Lucy','Lucy'],
                'Payroll' : [15,15,75,75,75],
                'Week' : [1,2,1,2,3]}
        df = pd.DataFrame(data)
    
    Name    Payroll Week
    0   John    15  1   
    1   John    15  2   
    2   Lucy    75  1   
    3   Lucy    75  2   
    4   Lucy    75  3
    

    我试图做的是在一个数据帧中应用一个布尔值,这个数据帧非常类似于这个数据帧,有2m+行和20+列,以确定某人何时开始

    要确定某人是否处于活动状态,我将条件传递给另一个df:

    df2 = df.loc[df.Week == df.Week.max()]
    

    df['Status'] = np.where(df['Payroll'].isin(df2['Payroll']), 'Active','Leaver')
    

    因此,使用上述代码,我得到了以下非常好的消息,这告诉我,由于约翰最近一周不在,他已经离开了公司

    Name    Payroll Week    Status
    0   John    15  1   Leaver
    1   John    15  2   Leaver
    2   Lucy    75  1   Active
    3   Lucy    75  2   Active
    4   Lucy    75  3   Active
    

    我想知道的是,约翰什么时候开始和我们在一起,我可以在一年中的每个星期尝试一个面具,并在他们第一次出现时检查一个isin,但我想一定有一种更像蟒蛇的方式来做到这一点!

    期望输出:

     Name   Payroll Week    Status
    0   John    15  1   Starter
    1   John    15  2   Leaver
    2   Lucy    75  1   Starter
    3   Lucy    75  2   Active
    4   Lucy    75  3   Active
    

    非常感谢您的帮助。

    data = {'Name' : ['John','John','John','John','Lucy','Lucy','Lucy','Lucy','Lucy'],
                'Payroll' : [15,15,15,15,75,75,75,75,75],
                'Week' : [1,2,3,4,1,2,3,4,5]}
    
    df = pd.DataFrame(data)
    

    期望输出:

        Name    Payroll Week    Status
    0   John    15      1   Starter
    1   John    15      2   Active
    2   John    15      3   Active
    3   John    15      4   Leaver
    4   Lucy    75      1   Starter
    5   Lucy    75      2   Active
    6   Lucy    75      3   Active
    7   Lucy    75      4   Active
    8   Lucy    75      5   Active
    

    注意事项:

    2 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    numpy.select 以新的条件 duplicated

    a = df.loc[df.Week == df.Week.max(), 'Payroll']
    m1 = ~df['Payroll'].isin(a)
    m2 = ~df['Payroll'].duplicated()
    m3 = ~df['Payroll'].duplicated(keep='last')
    
    df['Status'] = np.select([m2, m1 & m3], ['Starter', 'Leaver'], 'Active')
    print (df)
       Name  Payroll  Week   Status
    0  John       15     1  Starter
    1  John       15     2   Active
    2  John       15     3   Active
    3  John       15     4   Leaver
    4  Lucy       75     1  Starter
    5  Lucy       75     2   Active
    6  Lucy       75     3   Active
    7  Lucy       75     4   Active
    8  Lucy       75     5   Active
    
        2
  •  2
  •   sophros    6 年前

    我遇到的最简单的方法是使用 groupby

    for _, dfg in df.groupby(df['Name']):
        gidx = min(dfg.index)
        df.loc[df.index == gidx,'Status'] = 'Starter'
    
    print(df)
    

    df

       Name  Payroll  Week   Status
    0  John       15     1  Starter
    1  John       15     2   Leaver
    2  Lucy       75     1  Starter
    3  Lucy       75     2   Active
    4  Lucy       75     3   Active