用于条件替换的Groupby或循环

时间:2018-02-14 07:54:50

标签: 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

我想找到所有在2017年开始在ID中看到其域名发生变化的部门 然后,我想将域(在2016 *行中)替换为与2017 *行的账面价值相匹配的域的值 例如,在上面说明的df中,我想用DEP替换DEPT 896的2016 *行的Domain值,这是2017 *行中相应Dept的域值。

2 个答案:

答案 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