有条件地将值从一列复制到另一列

时间:2019-09-16 13:54:59

标签: python pandas

我有一个熊猫数据框,看起来像这样:

 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'  

可悲的是,我似乎无法弄清楚如何从需要条件的另一列中获取值。

欢迎您提供任何帮助! 预先感谢。

1 个答案:

答案 0 :(得分:3)

此答案假设您的DataFrame按namejobchange_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并使用第一个可以更快解决方案。