Python - присвоить значение от одного pandas df другому на основе строки, появляющейся в тексте - PullRequest
2 голосов
/ 09 июля 2020

Вот пример моих данных:

import pandas as pd

data = {'Text':['This is an example,', 
                'Another sentence is here.', 
                'Lets have fun.', 
                'this happened weeks ago.',
                'I am not sure what to put here.',
                'Another fake sentence.'], 
        'Score':[20, 21, 19, 18, 16, 12]} 
  
# Create DataFrame 
df = pd.DataFrame(data) 


data_words = {'words':['is', 
                'fun', 
                'happened', 
                'example'], 
        'frequency':[127, 112, 1234, 32]} 
  
# Create DataFrame 
df2 = pd.DataFrame(data_words) 



#Final Result:

data_result = {'words':['is', 
                'fun', 
                'happened', 
                'example'], 
        'frequency':[127, 112, 1234, 32],
            'Text': ['This is an example,',
                    'Lets have fun.',
                    'this happened weeks ago.',
                    'This is an example,']} 

df_final = pd.DataFrame(data_result) 

Я пытаюсь сопоставить df['text'] с df2['words'] в зависимости от того, появляется ли слово в тексте. Мне нужен только один текст на слово, и в идеале он будет основан на "Score", но это не совсем необходимо.

Итак, последний df будет иметь столбцы: "Text", "Score", "words" и "frequency"

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Простое понимание списка между двумя фреймами данных и первое вхождение с [0]

df2['Text'] = df2['words'].apply(lambda x: [y for y in df['Text'] if x in y][0])

вывод:

    words       frequency   Text
0   is          127         This is an example,
1   fun         112         Lets have fun.
2   happened    1234        this happened weeks ago.
3   example     32          This is an example,

Объясняя понимание списка, я возвращаю значение " y "при поиске" x "в" y ", где x - каждая строка для words, а y - каждая строка для text. Это возвращает список всех совпадений для каждой строки. В некоторых строках было несколько значений в списке, так как несколько совпадений, поэтому для вашего ожидаемого результата я добавил [0] в конец, чтобы взять первое значение, которое было возвращено в каждом списке для понимания списка, которое применялось построчно -row с лямбда x. В противном случае без [0] будет возвращен список всех совпадений.

0 голосов
/ 09 июля 2020

Вот как вы можете использовать enumerate():

df3 = {'Text':[],'Score':[],'words':[],'frequency':[]}
for i1,w in enumerate(data_words['words']):
    for i2,txt in enumerate(data['Text']):
        if w in txt and w not in d['words']:
            d['Text'].append(txt)
            d['words'].append(w)
            d['Score'].append(data['Score'][i2])
            d['frequency'].append(data_words['frequency'][i1])
            
print(pd.DataFrame(df3))

Вывод:

                       Text  Score     words  frequency
0       This is an example,     20        is        127
1            Lets have fun.     19       fun        112
2  this happened weeks ago.     18  happened       1234
3       This is an example,     20   example         32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...