Получить количество строк, найденных в столбце A, из столбца B и возвращаемое значение в новом столбце

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь получить количество содержимого одного столбца во втором столбце в pandas. Я хотел бы поместить количество частот в новый столбец с именем frequency.

Я хотел бы найти, сколько раз строка в моем столбце [Ключевое слово] встречается в столбце [Описание] в новом столбце с именем [Частота].

Желаемый результат

 [keyword]           [Description]          [Frequency]
car                 car dog car car             3
car                 car dog dog dog             1
new car             old car car dog             0
 

Код, который я пробовал

Я попробовал следующий код, но возникли две проблемы. (Количество частот не было точным, а форматирование было совершенно неправильным).

 s = df['Keyword']
pat = r'b{}b'.format('|'.join(s))

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df_new = pd.DataFrame(mlb.fit_transform(df['Description'].str.findall(pat)),
                  columns=mlb.classes_,
                  index=df.index).reindex(columns=s, fill_value=0)
 

Ответ №1:

Используйте это, если вам нужны точные совпадения слов:

 df['frequency'] = [len(re.findall(rf'b{k}b', d)) for k, d in zip(df['keyword'], df['Description'])]
print(df)
 

Вывод

    keyword       Description  frequency
0      car   car dog car car          3
1      car   car dog dog dog          1
2  new car   old car car dog          0
 

Лучшей альтернативой, предложенной @jezrael, является:

 df['frequency'] = [len(re.findall(rf'b{k}b', d)) for k, d in df[['Description', 'keyword']].to_numpy()]
 

Ответ №2:

Если точное совпадение не имеет значения count , это означает, что carito в описании оно совпадает car . Если нужно избежать этого, используйте @Dani Mesejo answer.

 df['new'] = df.apply(lambda x: x['Description'].count(x['keyword']), axis=1)
print (df)
   keyword      Description  Frequency  new
0      car  car dog car car          3    3
1      car  car dog dog dog          1    1
2  new car  old car car dog          0    0