Панда манипулирование: сопоставление данных из других столбцов в один столбец, применяется уникально для всех строк - PullRequest
0 голосов
/ 11 января 2019

У меня есть модель, которая предсказывает 10 слов для определенного курса в порядке вероятности, и я хотел бы, чтобы первые 5 слов из тех слов, которые появились в описании курса .

Это формат данных:

course_name course_title    course_description  predicted_word_10   predicted_word_9    predicted_word_8    predicted_word_7    predicted_word_6    predicted_word_5    predicted_word_4    predicted_word_3    predicted_word_2    predicted_word_1
Xmath 32    Precalculus     Polynomial and rational functions, exponential...   directed    scholars    approach    build   african different   visual  cultures    placed  global
Xphilos 2   Morality        Introduction to ethical and political philosop...   make    presentation    weekly  european    ways    general range   questions   liberal speakers

Моя идея состоит в том, чтобы каждая строка начинала итерацию с predicted_word_1 до тех пор, пока я не получу первые 5 в описании. Я хотел бы сохранить эти слова в порядке их появления в дополнительных столбцах description_word_1 ... description_word_5. (Если в описании <5 предсказанных слов, я планирую вернуть NAN в соответствующих столбцах). </p>

Чтобы пояснить на примере: если course_description курса - 'Polynomial and rational functions, exponential and logarithmic functions, trigonometry and trigonometric functions. Complex numbers, fundamental theorem of algebra, mathematical induction, binomial theorem, series, and sequences. ' и его первые несколько предсказанных слов - irrelevantword1, induction, exponential, logarithmic, irrelevantword2, polynomial, algebra...

Я бы хотел вернуть induction, exponential, logarithmic, polynomial, algebra для этого в таком порядке и сделать то же самое для остальных курсов.

Моя попытка состояла в том, чтобы определить функцию применения, которая будет брать строку и повторяться от первого предсказанного слова до тех пор, пока не найдет первые 5 в описании, но часть, которую я не могу понять, - это как их создать дополнительные столбцы, в которых есть правильные слова для каждого курса. Этот код в настоящее время будет хранить слова только для одного курса для всех строк.

def find_top_description_words(row):
    print(row['course_title'])
    description_words_index=1
    for i in range(num_words_per_course): 
        description = row.loc['course_description']
        word_i = row.loc['predicted_word_' + str(i+1)]
        if (word_i in description) & (description_words_index <=5) :
            print(description_words_index)
            row['description_word_' + str(description_words_index)] = word_i
            description_words_index += 1


df.apply(find_top_description_words,axis=1)

Конечная цель этой манипуляции с данными состоит в том, чтобы сохранить первые 10 предсказанных слов из модели и первые 5 предсказанных слов в описании, чтобы кадр данных выглядел следующим образом:

course_name course_title  course_description top_description_word_1 ... top_description_word_5 predicted_word_1 ... predicted_word_10 

Любые указатели приветствуются. Спасибо!

1 Ответ

0 голосов
/ 11 января 2019

Если я правильно понимаю:

Создайте новый DataFrame всего с 100 предсказанными словами:

pred_words_lists = df.apply(lambda x: list(x[3:].dropna())[::-1], axis = 1)

Обратите внимание, что в каждой строке есть списки с предсказанными словами. Порядок хороший, я имею в виду первое, непустое, предсказуемое слово на первом месте, второе на втором месте и т. Д.

Теперь давайте создадим новый DataFrame:

pred_words_df = pd.DataFrame(pred_words_lists.tolist())
pred_words_df.columns = df.columns[:2:-1]

И окончательный DataFrame:

final_df = df[['course_name', 'course_title', 'course_description']].join(pred_words_df.iloc[:,0:11])

Надеюсь, это сработает.

EDIT

def common_elements(xx, yy):
    temp = pd.Series(range(0, len(xx)), index= xx)
    return list(df.reindex(yy).sort_values()[0:10].dropna().index)

pred_words_lists = df.apply(lambda x: common_elements(x[2].replace(',','').split(), list(x[3:].dropna())), axis = 1)

Удовлетворяет ли он вашим требованиям?

Адаптированный раствор (OP):

def get_sorted_descriptions_words(course_description, predicted_words, k):
    description_words = course_description.replace(',','').split()
    predicted_words_list = list(predicted_words)
    predicted_words = pd.Series(range(0, len(predicted_words_list)), index=predicted_words_list)
    predicted_words = predicted_words[~predicted_words.index.duplicated()]
    ordered_description = predicted_words.reindex(description_words).dropna().sort_values()
    ordered_description_list = pd.Series(ordered_description.index).unique()[:k]

    return ordered_description_list

df.apply(lambda x: get_sorted_descriptions_words(x['course_description'], x.filter(regex=r'predicted_word_.*'), k), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...