2016-05-28 4 views
1

У меня есть огромные данные карточной карты [200 тыс. Записей] и фактические данные ученика [~ 100 М]. Я пытаюсь использовать функцию карты, чтобы преобразовать дискретное значение в наборе данных в числовой балл.Элегантный способ использования карты для скоринга дискретной переменной

Я конвертирую счет в объект dict, чтобы выполнить это. Есть ли лучший способ сделать то же самое без преобразования счет карты в Словаре или любой другой объект

#Score card Data 
import pandas as pd 
raw_data = {'math_grade': ['A', 'B','MISS'], 
     'score': [1, 2, 3]} 
df_math_grade = pd.DataFrame(raw_data, columns = ['math_grade', 'score']) 

#Convert Score card to dictionary 
di = df_math_grade.set_index('math_grade')['score'].to_dict() 

#STUDENT MARKS DATA 
student_marks = { 
     'STUDENT_ID': ['S1', 'S2', 'S3','S4','S5'], 
     'MATH_GRADE': ['A','B','C','X','MISS']} 
student_marks = pd.DataFrame(student_marks, columns = ['STUDENT_ID', 'MATH_GRADE']) 

student_marks["MATH_GRADE_SCORE"] = student_marks["MATH_GRADE"].map(di) 

student_marks 

ответ

0

Я думаю, что вы можете использовать merge с drop:

print (pd.merge(student_marks, 
       df_math_grade, 
       left_on='MATH_GRADE', 
       right_on='math_grade', 
       how='left').drop('math_grade', axis=1)) 

    STUDENT_ID MATH_GRADE score 
0   S1   A 1.0 
1   S2   B 2.0 
2   S3   C NaN 
3   S4   X NaN 
4   S5  MISS 3.0    

EDIT:

Другой раствор составляет map по Series, только пропустить to_dict:

s = df_math_grade.set_index('math_grade')['score'] 
print (s) 
math_grade 
A  1 
B  2 
MISS 3 
Name: score, dtype: int64 

student_marks["MATH_GRADE_SCORE"] = student_marks["MATH_GRADE"].map(di) 
student_marks["MATH_GRADE_SCORE1"] = student_marks.MATH_GRADE.map(s) 
print (student_marks) 
    STUDENT_ID MATH_GRADE MATH_GRADE_SCORE MATH_GRADE_SCORE1 
0   S1   A    1.0    1.0 
1   S2   B    2.0    2.0 
2   S3   C    NaN    NaN 
3   S4   X    NaN    NaN 
4   S5  MISS    3.0    3.0 
+0

На самом деле, я хочу, чтобы это было несколько столбцов, используя простую функцию, поэтому я избегаю присоединений, и я хочу, чтобы она была минимальной. Мой вопрос: можно ли использовать функцию карты с использованием фрейма данных вместо dict? – pmv

+0

Я думаю, что remap by 'dict' в одном из очень хороших решений, я добавляю карту' Serie', пожалуйста, проверьте мой ответ. – jezrael

+0

Если бы мой ответ был полезным, не забудьте [принять] (http://meta.stackexchange.com/a/5235/295067) Спасибо. – jezrael