对数据框进行双重分组

时间:2019-05-09 22:22:54

标签: python pandas

数据框:

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)..

如何执行此操作? 创建助手步骤列的答案也可以。

1 个答案:

答案 0 :(得分:2)

检查以下各项是否对您有用:

  1. 获取每个组的GRADE边界

    min_grade = df.groupby('CLASS').GRADE.transform('min')
    max_grade = df.groupby('CLASS').GRADE.transform('max')
    
  2. 查找默认类别以替换“ 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')
    
  3. 获取新的类别:

    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