Python 用于条件替换的Groupby或循环

Python 用于条件替换的Groupby或循环,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我对Python比较陌生。 我有一个如下性质的数据框架 ID DEPT DOMAIN 201606 271 GE **201606 896 IR** 201608 271 GE 201609 271 GE ..................... ................... **201701 896 FR** 201606 271 GE 我

我对Python比较陌生。 我有一个如下性质的数据框架

ID     DEPT     DOMAIN          
201606  271     GE
**201606  896     IR**
201608  271     GE
201609  271     GE
.....................            
...................           
**201701  896     FR**
201606  271     GE
我想在ID中找到2017年以来域名发生变化的所有部门。
然后,我想用与2017*行账面价值相匹配的域的值替换域(2016*行)
例如,在上面所示的df中,我想用FR替换DEPT 896的2016*行的域值,FR是2017*行对应DEPT的域值。

我认为您需要先使用,然后再用于Series by
last 2017
和last
map
+
fillna

m1 = ~df.sort_values('ID').duplicated('DEPT', keep='last')
m2 = df['ID'].astype(str).str[:4] == '2017'
s = df[m1 & m2].set_index('DEPT')['DOMAIN']
df['DOMAIN'] = df['DEPT'].map(s).fillna(df['DOMAIN'])

print (df)
       ID  DEPT DOMAIN
0  201606   271     GE
1  201606   896     FR
2  201608   271     GE
3  201609   271     GE
4  201701   896     FR
5  201606   271     GE

你能分享你所拥有的吗?triedI最初试图获得部门和域的映射。因此尝试使用groupby或drop_duplicates方法来理解映射。然而,有相当多的部门,因此不容易可视化的图片。接下来要尝试的是:对于每一行迭代,对于每个部门,使用最新发生的(在数据集中或2017*以后)值更新前一行Domain@asimo-
2017
是否为最长年份?或者还有2018年?2017年是最大year@asimo-谢谢,所以我的解决方案运行得很好。我确实遇到了ValueError:无法从s=df[m1&m2]上的重复轴重新编制索引。请设置_index('DEPT')['DOMAIN']操作。这可能是因为一个给定的部门有多个域。可能是我将不得不以不同的方式替换或处理给定部门的所有这些多个域。我感到困惑。因为
.duplicated('DEPT',keep='last')
总是只返回一个唯一的
DEPT
-删除所有重复项并只返回最后一个。所以我不明白你怎么可能得到多个值。数据是保密的吗?是的。。目前,涉众似乎只对改变一个特定领域感兴趣。。所以我用了np.where来代替那个。。df['Domain']=np.where(df['ID']<201701,np.where(df['Domain']='IR',FR',df['Domain']),df['Domain'])ID已转换为int。。我将很快重新讨论这个重复的问题..寻找一个可能的永久解决方案。。干杯感谢您的解释,然后可以将代码简化为
df['Domain']=df['Domain'].mask((df['ID']<201701)和(df['Domain']='IR'),'FR')