考虑以下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的人的第一周使他们成为了入门者。
将两周之间的所有星期都设置为有效。
答案 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