Пересечение 2 столбцов в пределах одного фрейма данных pandas

#python #python-3.x #pandas #dataframe

#python #python-3.x #pandas #фрейм данных

Вопрос:

 import pandas as pd

df = pd.DataFrame({'Environment': [['AppleOS X','postgres','Apache','tomcat']], 'Description': [['Apache', 'Commons', 'Base32', 'decoding', 'invalid', 'rejecting', '.', 'via','valid', '.']] })

                             Environment                                                                Description
0  [AppleOS X, postgres, Apache, tomcat]  [Apache, Commons, Base32, decoding, invalid, rejecting, ., via, valid, .]
  

Я новичок в Pandas и фреймах данных, и я сомневаюсь в нахождении пересечения двух столбцов, упомянутых выше.

Цель:

Среда и описание — это два столбца в фрейме данных. Цель состоит в том, чтобы создать новый столбец с пересечением строк, присутствующих в первых двух столбцах.

Существующая реализация:

 def f(param):
    return set.intersection(set(param['Environment']),set(param['Description']))

df['unique_words'] = df.apply(f, axis=1)
print(df['unique_words'])
  

Этот синтаксис пересечения наборов — это то, на что я ссылался в https://www.kite.com/python/answers/how-to-find-the-intersection-of-two-lists-in-python

Проблема:

Я не уверен, как работает приведенный выше синтаксис, но он возвращает с {}

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

Поскольку [‘Apache’] присутствует в обоих столбцах, это должно быть значение в новом столбце, созданном в фрейме данных.

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

Ответ №1:

  • использовать set.intersection
  • map значения в списке в нижнем регистре
  • С точки зрения обработки естественного языка, все значения списка должны быть преобразованы в нижний регистр.
 # assumes only the two columns in the dataframe
df['common_words'] = df.apply(lambda x: list(set(map(str.lower, x[0])).intersection(map(str.lower, x[1]))), axis=1)

# if there are many columns, specify the two desired columns to compare
df['common_words'] = df[['Environment', 'Description']].apply(lambda x: list(set(map(str.lower, x[0])).intersection(map(str.lower, x[1]))), axis=1)

# display(df)
                             Environment                                                                Description common_words
0  [AppleOS X, postgres, Apache, tomcat]  [Apache, Commons, Base32, decoding, invalid, rejecting, ., via, valid, .]     [apache]
  

Комментарии:

1. Трентон Маккинни: Спасибо, это помогло! 🙂