熊猫找到最早出现的陈述并开始使用

时间:2018-11-19 10:32:07

标签: python pandas

考虑以下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

我试图做的是在整个DataFrame中应用一个布尔值,该布尔值与此类似,具有2m +行和20+列,以查找某人何时开始

要确定某人是否活跃,我将条件传递给另一个df:

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

这给了我最后一个星期,然后我使用一个isin过滤器来确定该人是否活跃或离开了

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

注意事项:

最长一周为5,所以不在第5周的任何人都是离开者

在df的人的第一周使他们成为了入门者。

将两周之间的所有星期都设置为有效。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我遇到的最简单的方法是使用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