【问题标题】:Groupby or Looping for conditional replacingGroupby 或 Looping 用于条件替换
【发布时间】:2018-02-14 07:54:50
【问题描述】:

我对 Python 比较陌生。 我有以下性质的数据框

ID     DEPT     DOMAIN          
201606  271     GE
**201606  896     IR**
201608  271     GE
201609  271     GE
.....................            
...................           
**201701  896     FR**
201606  271     GE

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

【问题讨论】:

  • 你能分享你的尝试吗
  • 我最初试图获取 Dept 和 Domain 的映射。因此尝试使用 groupby 或 drop_duplicates 方法来理解映射。然而,有很多部门,因此不容易可视化图片。接下来要尝试的是:对于每个行迭代,对于每个 Dept,使用 Domain 的最新出现(在数据集中或 2017* 以后)值更新前面的行
  • @asimo - 2017 是最大年份吗?或者还有2018?
  • 2017 年是最高年份
  • @asimo - 谢谢,所以我的解决方案运行良好。

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

我认为您首先需要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

【讨论】:

  • 我确实遇到了 ValueError: cannot reindex from a duplicate axis on the s = df[m1 & m2].set_index('DEPT')['DOMAIN'] 操作。这可能是由于给定 DEPT 有多个域。可能我必须以不同的方式替换或处理给定 DEPT 的所有这些多个域
  • 我很困惑。因为.duplicated('DEPT', keep='last') 总是只返回一个唯一的DEPT - 删除所有重复项并只返回最后一个。所以我不明白你怎么可能得到多个值。数据是保密的吗?
  • 它是.. 目前,利益相关者似乎只对更改一个特定域感兴趣.. 所以我使用 np.where 替换那个.. df['Domain'] = np .where(df['ID']
  • 感谢您的解释,然后可以将代码简化为df['Domain'] = df['Domain'].mask((df['ID'] < 201701) & (df['Domain'] == 'IR'), 'FR')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2018-10-29
  • 1970-01-01
  • 2020-05-28
  • 2019-04-10
  • 2013-01-23
  • 2022-01-22
相关资源
最近更新 更多