我有一些带有考试成绩信息的ID号(df索引)。每个测试均包含子测试。所有SubTest分数都在同一个字段中,还有另一个字段告诉您测试类型(即分隔符)。举例来说,我有GRE。 GRE包含三个子测验:语言,分析写作和定量测试。一个字段具有测试类型(GRE),另一字段具有一个字段中的测试得分值(GRE口头156.0 / 170.0 GRE分析写作4.5 / 6.0 GRE定量157.0 / 170.0)。该数据集中具有相同结构的其他多个测试。我想使用“测试类型”列作为“测试得分值”字段上.split方法的定界符,并具有expand = True,但它永远无法正常工作...我一直遇到关键错误。
我尝试了许多不同的方法(其中许多是来自与我的问题不完全匹配的关于stackoverflow的类似问题):
1。)
df[['Score1', 'Score2', 'Score3','Score4','Score5']] = [x.split(df['Delimiter'], n = 5, expand=True) for x in df['Test Score Values']]
这导致出现“ KeyError:分隔符”
2。)
df[['Score1', 'Score2', 'Score3','Score4','Score5']] = df.apply(lambda x: x['Test Score Values'].str.split(df['Delimiter'], n = 5, expand=True))
这导致“ KeyError :('测试得分值','发生在索引ID')“
3。)
df[['Score1', 'Score2', 'Score3','Score4','Score5']] = df['Test Score Values'].split(df['Delimiter'], n = 5, expand=True)
这导致“ AttributeError:'Series'对象没有属性'split'”
4。)
df['Test Score Values'].apply(lambda x: x.split(x['Delimiter'],expand=True))
这导致“ TypeError:字符串索引必须为整数”
我总是收到错误消息,但与起初的GRE示例一样,我想要得到的是类似的东西。
ID Delimiter TestScoreValues
1 GRE GRE Verbal 156.0/170.0 GRE Analytical Writing 4.5/6.0 GRE Quantitative 157.0/170.0
Score1 Score2 Score 3
Verbal 156.0/170.0 Analytical Writing 4.5/6.0 Quantitative 157.0/170.0
然后,我想进一步细分它们,但是解决此分裂将是一个不错的第一步,因为之后我可以在不同分数内划分空间。
有人可以帮忙吗?
答案 0 :(得分:1)
对于高度特定的操作, 我建议使用循环 ,因为它们具有灵活性和可读性。 (尽管我会强调,这并不是自动进行此类事情的最优化方法。)
首先,初始化您的数据框:
import pandas as pd
s = {'Test Type':'GRE',
'Test Score':'GRE Verbal 156.0/170.0 GRE Analytical Writing 4.5/6.0 GRE Quantitative 157.0/170.0',
}
df = pd.DataFrame([s])
print(df.head())
#
# Test Score Test Type
# 0 GRE Verbal 156.0/170.0 GRE Analytical Writing ... GRE
接下来,遍历您的df并执行必要的字符串操作:
new_values = []
for idx, row in df.iterrows():
scores = row['Test Score'].split(row['Test Type'])
for s in scores:
# You don't want the blank items
if s!='':
s = s.strip().split()
# get the section and the score for each
section, score_actual = ' '.join(s[:-1]),s[-1]
new_values.append({
'Test': row['Test Type'],
'Section':section,
'Score': score_actual})
df_new = pd.DataFrame(new_values)
print(df_new.head())
#
# Score Section Test
# 0 156.0/170.0 Verbal GRE
# 1 4.5/6.0 Analytical Writing GRE
# 2 157.0/170.0 Quantitative GRE
您可以走得更远,开始将每一行的分数降低到最低分数,或者创建一个新表,将每项考试的每个部分的最高分列出来,但是我将留给您。