首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于多组条件创建新列

基于多组条件创建新列
EN

Stack Overflow用户
提问于 2018-04-01 00:16:22
回答 3查看 95关注 0票数 2

我希望在这个df中有一个新列,其条件如下。列education是一个从1到5的分类值(1是较低的教育水平,5是较高的教育水平)。我想用以下逻辑创建一个函数(以便在df中创建一个新列)

首先,对于任何身份证检查,如果至少有一个教育水平毕业,那么新的一栏必须有较高的教育程度毕业。

第二,如果没有某一特定身份的毕业教育水平(必须在“课程”中包含所有教育水平)。因此,必须检查教育的最高水平和减一。

代码语言:javascript
运行
复制
df
id  education stage
1   2         Graduated
1   3         Graduated
1   4         In course
2   3         In course
3   2         Graduated
3   3         In course
4   2         In course

预期产出:

代码语言:javascript
运行
复制
id  education stage       new_column
1   2         Graduated   3
1   3         Graduated   3
1   4         In course   3
2   3         In course   2
3   2         Graduated   2
3   3         In course   2
4   2         In course   1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-01 00:50:42

你可以这样做:

代码语言:javascript
运行
复制
import pandas as pd
df = pd.DataFrame({'id': [1, 1, 1, 2, 3, 3, 4], 'education': [2, 3, 4, 3, 2, 3, 2],
                   'stage': ['Graduated', 'Graduated', 'In course', 'In course', 'Graduated', 'In course', 'In course']})


max_gr = df[df.stage == 'Graduated'].groupby('id').education.max()
max_ic = df[df.stage == 'In course'].groupby('id').education.max()

# set all cells to the value from max_ed
df['new_col'] = df.id.map(max_gr)
# set cells that have not been filled to the value from max_ic - 1
df.loc[df.new_col.isna(), ['new_col']] = df.id.map(max_ic - 1)

series.map(other_series)返回一个新的系列,其中来自series的值已被来自other_series的值替换。

票数 4
EN

Stack Overflow用户

发布于 2018-04-01 00:59:18

这是一条路。

代码语言:javascript
运行
复制
df['new'] = df.loc[df['stage'] == 'Graduated']\
              .groupby('id')['education']\
              .transform(max).astype(int)

df['new'] = df['new'].fillna(df.loc[df['stage'] == 'InCourse']\
                               .groupby('id')['education']\
                               .transform(max).sub(1)).astype(int)

结果

代码语言:javascript
运行
复制
   id  education      stage  new
0   1          2  Graduated    3
1   1          3  Graduated    3
2   1          4   InCourse    3
3   2          3   InCourse    2
4   3          2  Graduated    2
5   3          3   InCourse    2
6   4          2   InCourse    1

解释

  • 首先,映射到按id分组的“分级”数据集。
  • 第二,映射到按id分组的"InCourse“数据集(按最大值教育减去1 )。
票数 2
EN

Stack Overflow用户

发布于 2018-04-01 01:27:22

基于Markus ffler的替代解决方案

代码语言:javascript
运行
复制
max_ic = df[df.stage.eq('In course')].groupby('id').education.max() - 1
max_gr = df[df.stage.eq('Graduated')].groupby('id').education.max()

# Update with max_gr
max_ic.update(max_gr)

df['new_col'] = df.id.map(max_ic)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49593656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档