如何将列内容解包到由单元格值确定的新列

2024-06-16 12:48:40 发布

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

我有一个数据框架,其中包含有关学生成绩、考试成绩和其他指标的信息。其中一列包含逗号分隔的文本,其中每个逗号分隔的值都是数学类的名称以及学生在该类中取得的成绩。因此,数据框如下所示:

STUDENT_ID    TEST_SCORE_1    TEST_SCORE_2    MATHS
001           85              93              ALGEBRA_B+,GEOMETRY_A-,TRIGONOMETRY_C
002           73              95              ALGEBRA_B,GEOMETRY_B+,CALCULUS_C

我想要的是每个类都有对应的列,只需要有包含等级的单元格,如下所示:

STUDENT_ID    TEST_SCORE_1    TEST_SCORE_2    ALGEBRA    GEOMETRY    TRIGONOMETRY    CALCULUS
001           85              93              B+         A-          C               NaN
002           73              95              B          B+          NaN             C

我第一次尝试这样做

df.merge(df['Maths'].apply(unpack_grades), left_index=True, right_index=True)

其中unpack_grades是一个函数,它解析类和年级字符串,并返回一个pandas系列,其中包含目录中的每门数学课程,作为键,分数作为值(如果学生没有上课,则为NaN)。以下是该函数的开头:

def unpack_grades(x):

    courses = [a.strip() for a in x.split(',')]

但是,我得到以下错误:

AttributeError: 'float' object has no attribute 'split'

如果有人能为我的错误提出一个解决方案,或者如果有更直接的方法来实现我的目标,那就太好了


Tags: 数据testidnanstudent学生scoregrades
1条回答
网友
1楼 · 发布于 2024-06-16 12:48:40

您可以在这里使用正则表达式和pivot

u = df.MATHS.str.extractall(r'([a-zA-Z]+)_([A-F][+-]?)').reset_index(1, drop=True)

#               0   1
# 0       ALGEBRA  B+
# 0      GEOMETRY  A-
# 0  TRIGONOMETRY   C
# 1       ALGEBRA   B
# 1      GEOMETRY  B+
# 1      CALCULUS   C

p = u.pivot(columns=0, values=1)

# 0 ALGEBRA CALCULUS GEOMETRY TRIGONOMETRY
# 0      B+      NaN       A-            C
# 1       B        C       B+          NaN

pd.concat([df.iloc[:, :-1], p], axis=1)

   STUDENT_ID  TEST_SCORE_1  TEST_SCORE_2 ALGEBRA CALCULUS GEOMETRY TRIGONOMETRY
0           1            85            93      B+      NaN       A-            C
1           2            73            95       B        C       B+          NaN

正则表达式解释

(                            # capture group 1
  [a-zA-Z]                   # match letters
  +                          # match 1 or more times
)
_                            # match the _ character
(                            # capture group 2
  [A-F]                      # match A-F (possible grades)
  [+-]                       # match either + or -
  ?                          # optional match of the + or -
)

相关问题 更多 >