代码之家  ›  专栏  ›  技术社区  ›  MEdwin

如何在分类数据框列上应用python lamda函数

  •  1
  • MEdwin  · 技术社区  · 8 年前

    如何在这个分类数据帧上应用lambda函数?注意,分数是绝对的。我希望C以上的能通过。相反,它显示“失败”。

    import pandas as pd
    dfg = pd.DataFrame(['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D'],
                      index=['excellent', 'excellent', 'excellent', 'good', 'good', 'good', 'ok', 'ok', 'ok', 'poor', 'poor'])
    dfg.rename(columns={0: 'Grades'}, inplace=True)
    dfg['Grades'] = dfg['Grades'].astype('category',
                                 categories=['D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'],
                                 ordered=True)
    def Assess(row):
         if row>'C':
            return 'Pass'
         return 'Fail'
    
    dfg['Asses'] = dfg.apply(lambda x: Assess(x.Grades), axis=1)
    
    dfg
    

    见结果

    Grades  Asses
    excellent   A+  Fail
    excellent   A   Fail
    excellent   A-  Fail
    good    B+  Fail
    good    B   Fail
    good    B-  Fail
    ok  C+  Pass
    ok  C   Fail
    ok  C-  Pass
    poor    D+  Pass
    poor    D   Pass
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   piRSquared    8 年前

    你使用的方式 apply

    相反,对序列本身使用比较操作,并允许Pandas处理它的分类性质。

    dfg.assign(Assess=dfg.Grades > 'C')
    
              Grades  Asses
    excellent     A+   True
    excellent      A   True
    excellent     A-   True
    good          B+   True
    good           B   True
    good          B-   True
    ok            C+   True
    ok             C  False
    ok            C-  False
    poor          D+  False
    poor           D  False
    

    你可以用一个 map 通过/失败

    dfg.assign(Asses=dfg.Grades.gt('C').map({True: 'Pass', False: 'Fail'}))
    
              Grades Asses
    excellent     A+  Pass
    excellent      A  Pass
    excellent     A-  Pass
    good          B+  Pass
    good           B  Pass
    good          B-  Pass
    ok            C+  Pass
    ok             C  Fail
    ok            C-  Fail
    poor          D+  Fail
    poor           D  Fail
    

    如果你真的想 lambda

    m = dict(map(reversed, enumerate(dfg.Grades.cat.categories)))
    dfg.assign(Asses=dfg.apply(lambda row: 'Pass' if m[row.Grades] > m['C'] else 'Fail', 1))
    
              Grades Asses
    excellent     A+  Pass
    excellent      A  Pass
    excellent     A-  Pass
    good          B+  Pass
    good           B  Pass
    good          B-  Pass
    ok            C+  Pass
    ok             C  Fail
    ok            C-  Fail
    poor          D+  Fail
    poor           D  Fail
    
        2
  •  4
  •   user3483203    8 年前

    使用:

    dfg['Assess'] = np.where(dfg['Grades']>'C','Pass','Fail')
    dfg
    

             Grades Assess
    excellent     A+  Pass
    excellent      A  Pass
    excellent     A-  Pass
    good          B+  Pass
    good           B  Pass
    good          B-  Pass
    ok            C+  Pass
    ok             C  Fail
    ok            C-  Fail
    poor          D+  Fail
    poor           D  Fail