对Python来说相对较新。 我有一个以下性质的数据框
ID DEPT DOMAIN
201606 271 GE
**201606 896 IR**
201608 271 GE
201609 271 GE
.....................
...................
**201701 896 FR**
201606 271 GE
我想找到所有在2017年开始在ID中看到其域名发生变化的部门 然后,我想将域(在2016 *行中)替换为与2017 *行的账面价值相匹配的域的值 例如,在上面说明的df中,我想用DEP替换DEPT 896的2016 *行的Domain值,这是2017 *行中相应Dept的域值。
答案 0 :(得分:2)
我认为您首先需要sort_values
然后使用duplicated
进行系列last 2017
和最后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
答案 1 :(得分:2)
我认为您的问题可能比简单的groupby
+ transform
复杂一些。您需要确保仅替换以2017年ID结尾的那些组,而不是其他组。您可以使用两个groupby +转换操作执行此操作,然后执行np.where
。
g = df.groupby('DEPT')
i = g.DOMAIN.transform('last')
j = g.ID.transform('last').astype(str).str[:4] == '2017'
df.DOMAIN = np.where(j, i, df.DOMAIN)
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