Как объединить два строковых столбца, где один является подмножеством другого - PullRequest
0 голосов
/ 02 мая 2019

У меня есть DF1 и DF2, которые я хочу объединить с левой стороны (в столбце ['text'])

В DF2['text'] есть некоторые строки, которые являются подстрока DF1['text'].

Я попытался выполнить грязный цикл с помощью двойного цикла, но DF1 составляет около 200 тыс. Строк, а DF2 - около 2 тыс., Поэтому время кажется длинным (в лучшем случае)

DF1
id   text                           
1    'some text with details'       
2    'which are not always good'    
3    'irrelevant text'   
4    'I want to get rid of them'
5    'more irrelevant cells'

DF2
id   text                           tag
1    'with details'                 'Good'
2    'which are not'                'Bad'
3    'to get rid of'                'semiGood'
for i in range(len(DF2)):
    for k in range(len(DF1)):
        if DF2['text'][i] in DF2['text'][k]:
            DF1.loc[:,'tag'].iloc[k] = DF2['tag'][i]

Ожидаемый результат:

DF1
id   text                           tag
1    'some text with details'       'Good'
2    'which are not always good'    'Bad'
3    'irrelevant text'              
4    'I want to get rid of them'    'semiGood'
5    'more irrelevant cells'

Я хотел бы найти способ сделать это менее чем за 5 дней, что потребует двойной цикл.Есть что-то?

1 Ответ

0 голосов
/ 02 мая 2019

Я думаю, что мой подход немного сложен. Вы можете попробовать другие методы, если сможете найти. Это мой подход:

Сначала я разбил каждое слово в столбце text на DF1 и DF2:

splitDF1, splitDF2 = [],[]
for i,tt1 in enumerate(DF1['text']):
    splitDF1.append([i,tt1.split()])
for i,tt2 in enumerate(DF2['text']):
    splitDF2.append([i,tt2.split()])

Затем я сравниваю список разделенных текстов в DF1 с списком в DF2. Если разделенный текст в DF2 является подмножеством разделенного текста в DF2, сохраните tag в новом списке, в противном случае оставьте его пустым. Наконец, добавьте новый столбец tag в DF1, используя новый список.

DF1tag = []
for sdf1 in splitDF1:
    for sdf2 in splitDF2:
        if set(sdf2[1]).issubset(sdf1[1]):
            tag = DF2.iloc[sdf2[0]][2]
            break
        else:
            tag = ""
    DF1tag.append(tag)
DF1['tag'] = DF1tag

Выход:

print(DF1)

id                       text       tag
 1     some text with details      Good
 2  which are not always good       Bad
 3            irrelevant text          
 4  I want to get rid of them  semiGood
 5      more irrelevant cells          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...