我有一个熊猫数据框,看起来像这样:
name job jobchange_rank date
Thisguy Developer 1 2012
Thisguy Analyst 2 2014
Thisguy Data Scientist 3 2015
Anotherguy Developer 1 2018
jobchange_rank代表每个人(基于姓名)的排名变化,其中等级nr 1代表他/她的第一职位nr 2代表他/她的第二职位,等等。
现在好玩了。我想创建一个新列,以查看某人以前的工作,如下所示:
name job jobchange_rank date previous_job
Thisguy Developer 1 2012 None
Thisguy Analyst 2 2014 Developer
Thisguy Data Scientist 3 2015 Analyst
Anotherguy Developer 1 2018 None
我创建了以下代码,以获取没有工作更改的“无”值:
df.loc[df['jobchange_rank'].sub(df['jobchange_rank'].min()) == 0, 'previous_job'] = 'None'
可悲的是,我似乎无法弄清楚如何从需要条件的另一列中获取值。
欢迎您提供任何帮助! 预先感谢。
答案 0 :(得分:3)
此答案假设您的DataFrame按name
和jobchange_rank
排序,如果不是这种情况,请先排序。
# df = df.sort_values(['name', 'jobchange_rank'])
m = df['name'].eq(df['name'].shift())
df['job'].shift().where(m)
0 NaN
1 Developer
2 Analyst
3 NaN
Name: job, dtype: object
或使用groupby
+ shift
(假设至少按jobchange_rank
排序)
df.groupby('name')['job'].shift()
0 NaN
1 Developer
2 Analyst
3 NaN
Name: job, dtype: object
尽管groupby
+ shift
更为简洁,但对于较大的输入,如果已经按照示例对数据进行了排序,则避免使用groupby
并使用第一个可以更快解决方案。