Попытка разбить столбец данных на основе значений другой строки столбца в строке - PullRequest
3 голосов
/ 14 мая 2019

У меня есть несколько номеров ID (индекс df) с информацией о результатах теста.Каждый тест состоит из дополнительных тестов.Все оценки SubTest находятся в одном и том же поле, и есть другое поле, в котором указывается тип теста (т.е. разделитель).Скажем, например, у меня есть GRE.GRE имеет три подтеста: словесный, аналитический и количественный.Одно поле имеет тип теста (GRE), а другое поле имеет значения баллов теста в одном поле (GRE Verbal 156.0 / 170.0 GRE Analytical Writing 4.5 / 6.0 GRE Quantitative 157.0 / 170.0).Есть несколько других тестов в этом наборе данных той же структуры.Я хочу использовать столбец «Тип теста», чтобы выступать в качестве разделителя метода .split в поле «Значения оценки теста» и иметь параметр «развернуть = Истина», но он никогда не работает ... Я получаю ошибку ключа.

Я испробовал много разных подходов (многие из них были из похожих вопросов о стековом потоке, которые точно не соответствуют моей проблеме):

1.)

df[['Score1', 'Score2', 'Score3','Score4','Score5']] = [x.split(df['Delimiter'], n = 5, expand=True) for x in df['Test Score Values']] 

Это привело к «KeyError: Delimiter»

2.)

df[['Score1', 'Score2', 'Score3','Score4','Score5']] = df.apply(lambda x: x['Test Score Values'].str.split(df['Delimiter'], n = 5, expand=True))

Это привело к «KeyError: (« Значения оценки теста »,« произошло с идентификатором индекса »)»

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    

Затем я хотел бы разбить их дальше, но решение этого разбиения было бы хорошим первым шагом, потому что после этого я могу разделить пространство между различными баллами.

Может кто-нибудь помочьпожалуйста * * 1030

1 Ответ

1 голос
/ 14 мая 2019

Для очень специфических манипуляций Я рекомендую для циклов , учитывая их гибкость и удобочитаемость. (Хотя я подчеркну, что это автоматически не самый оптимизированный способ сделать подобные вещи.)

Сначала инициализируйте ваш фрейм данных:

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

Вы можете пойти еще дальше и начать манипулировать каждой строкой до ее процентного значения,или создайте новую таблицу с максимальным количеством баллов для каждого раздела за экзамен, но я оставлю это вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...