尝试根据每行另一列行的值拆分数据框列

时间:2019-05-14 15:54:56

标签: python string pandas split

我有一些带有考试成绩信息的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    

然后,我想进一步细分它们,但是解决此分裂将是一个不错的第一步,因为之后我可以在不同分数内划分空间。

有人可以帮忙吗?

1 个答案:

答案 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

您可以走得更远,开始将每一行的分数降低到最低分数,或者创建一个新表,将每项考试的每个部分的最高分列出来,但是我将留给您。