如何在分类数据帧列上应用Python的lambda函数

2024-04-20 09:45:37 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在这个分类数据帧上应用lambda函数?注意成绩是绝对的。我希望C以上的人能通过。相反,它显示“Fail”。你知道吗

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

Tags: lambdatruereturnokpassrowpdfail
2条回答

用途:

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

您使用apply的方式将字符串传递到函数中,而不是一个分类的东西。你知道吗

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

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

相关问题 更多 >