数据框:
STUD_ID CLASS GRADE CATEGORY
1 'Sci' 2 'Alpha'
2 'Sci' 7 undefined
3 'Sci' 9 'Alpha'
4 'Sci' NaN 'Alpha'
5 'Sci' 9 'Alpha'
6 'math' 9 undefined
7 'eng' 8 'Gamma'
8 'eng' 5 'Gamma'
9 'eng' 3 undefined
10 'Art' 3 'Lambda'
11 'Art' 8 'Lambda'
12 'Art' 5 undefined
13 'Art' 1 undefined
14 'Art' NaN undefined
我期待确定学生类别“ undefined”是否实际上是该特定班级中存在的其他类别。要知道这一点,它应该检查“未定义”类别学生的成绩是否在该类别中其他类别的最小值-最大值之间。
例如:第2行中的学生具有“未定义的类别”:类别的等级应更改为“ Alpha”,因为其7年级介于“ Alpha”最低和最高等级(2和9)之间。 “ Alpha”是“ Sci”类的另一类
例如相反,第9行是学生。由于其3年级不在“ Gamma”的成绩范围内,因此其类别不应不更改为“ Gamma” (5-8)。 “伽玛”是“英语”课程的另一类
例如,在第14行中,由于np.NaN不具有可比性,因此“ undefined”不应更改。
例如,在第6行中,“ undefined”不应更改,因为没有其他 类别。
结果
STUD_ID CLASS GRADE CATEGORY
1 'Sci' 2 'Alpha'
2 'Sci' 7 'Alpha' *
3 'Sci' 9 'Alpha'
4 'Sci' NaN 'Alpha'
5 'Sci' 9 'Alpha'
6 'math' 9 undefined
7 'eng' 8 'Gamma'
8 'eng' 5 'Gamma'
9 'eng' 3 undefined
10 'Art' 3 'Lambda'
11 'Art' 8 'Lambda'
12 'Art' 5 'Lambda' *
13 'Art' 1 undefined
14 'Art' NaN undefined
对于第一个未定义。访问“科学”组后如何访问“ Alpha”等级组?
我知道可以访问当前班级组
df.loc[df['CATEGORY'] == 'undefined', 'CATEGORY'] = df.groupby('CLASS')...
如果可以同时访问CLASS和CATEGORY(“ undefined”除外),则如下所示。
func = lambda series : ...get min and max of series...
df.loc[df['CATEGORY'] == 'undefined', 'CATEGORY'] = df.groupby('CLASS').groupby('CATEGORY').where('CATEGORY'!='undefined').transform(func)..
如何执行此操作? 创建助手步骤列的答案也可以。
答案 0 :(得分:2)
检查以下各项是否对您有用:
获取每个组的GRADE边界
min_grade = df.groupby('CLASS').GRADE.transform('min')
max_grade = df.groupby('CLASS').GRADE.transform('max')
查找默认类别以替换“ undefined”(如果合格)。下面的行将检索同一组中存在的第一个元素,如果存在则为“ undefined”,否则为“ undefined”
更新:先前的代码在Pandas-0.17.1 / python-2.7.2上有效,但在Pandas-0.24上产生 ValueError 。 1 / Python-3.7.2。下面的行在Pandas-0.24.1上进行了测试:
default_cat = df.groupby('CLASS').CATEGORY.transform(
lambda x: x[x!='undefined'].iat[0] if x[x!='undefined'].size > 0 else 'undefined'
)
另一种计算default_cat的方法:
default_cat = df.assign(
cat=df.CATEGORY.replace({'undefined': np.nan})
) \
.groupby('CLASS').cat.transform('first') \
.fillna('undefined')
获取新的类别:
df['new_cat'] = df.CATEGORY.mask(
df.CATEGORY.eq('undefined') & df.GRADE.gt(min_grade) & df.GRADE.lt(max_grade)
, default_cat
)
print(df)
# STUD_ID CLASS GRADE CATEGORY new_cat
#0 1 Sci 2 Alpha Alpha
#1 2 Sci 7 undefined Alpha
#2 3 Sci 9 Alpha Alpha
#3 4 Sci NaN Alpha Alpha
#4 5 Sci 9 Alpha Alpha
#5 6 math 9 undefined undefined
#6 7 eng 8 Gamma Gamma
#7 8 eng 5 Gamma Gamma
#8 9 eng 3 undefined undefined
#9 10 Art 3 Lambda Lambda
#10 11 Art 8 Lambda Lambda
#11 12 Art 5 undefined Lambda
#12 13 Art 1 undefined undefined
#13 14 Art NaN undefined undefined