Как проверить, содержит ли столбец dataframe несколько наборов строк, и вывести строку для каждого набора, который он содержит

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

#python-3.x #pandas #Список #dataframe

Вопрос:

У меня есть 2 фрейма данных — 1 таблица данных и еще один для таких тем

 df_Data = pd.DataFrame({'ID':['123','456','789','100','200'],
                    'Names':['the dog is Red and blue','Cat is Pink','animal is cyan','pet is BLUE','i am green']})

df_Topics = pd.DataFrame({'Blue':['blue','cyan','aqua'],
                    'Red':['red','pinnk','fuscia','crimson']})
  

Я хочу использовать список тем для поиска, есть ли какие-либо из этих ключевых слов в df_Data, а затем создать новую таблицу, в которой темы были найдены в данных, подобных этому:

 ID   Topics
123   Blue
123   Red
456   Red
789   Blue
100   Blue
  

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

1. Ваш второй фрейм данных не воспроизводим. Можете ли вы протестировать и исправить то же самое?

Ответ №1:

Вы можете extract использовать все ключевые слова в своем Names столбце, используя выражение регулярного выражения, а затем map вернуться к основному цвету. Для этого вам нужна другая структура данных df_topics , которая лучше подходит в качестве dict :

 df_Topics = {'Blue': ['blue','cyan','aqua'], 'Red': ['red','pink','fuscia','crimson']}

s = {color: k for k, v in df_Topics.items() for color in v}

print (s)

{'blue': 'Blue', 'cyan': 'Blue', 'aqua': 'Blue', 'red': 'Red', 'pink': 'Red', 'fuscia': 'Red', 'crimson': 'Red'}
  

Теперь используйте str.extractall , чтобы получить все ключевые слова, назначить обратно столбцу и, наконец map , обратно:

 df_Data = (df_Data.assign(Topics=df_Data["Names"].str.extractall(f'({"|".join(s)})', flags=re.I)
                          .groupby(level=0).agg(list)).explode("Topics"))

print (df_Data.assign(Topics=df_Data["Topics"].str.lower().map(s)))

    ID                    Names Topics
0  123  the dog is Red and blue    Red
0  123  the dog is Red and blue   Blue
1  456              Cat is Pink    Red
2  789           animal is cyan   Blue
3  100              pet is BLUE   Blue
4  200               i am green    NaN
  

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

1. Спасибо, это работает очень хорошо. Я планирую начать с csv, поэтому использую этот код для чтения csv в формате, с которого вы начинаете: reader = csv.DictReader(open(file_location_kw)) df_Topics = {} для строки в reader: для столбца, значение в row.items(): # considerate .iteritems() для Python 2, если значение !=»: df_Topics.setdefault(столбец, []).добавить(значение) печать (df_Topics)

Ответ №2:

Спасибо! Это работает очень хорошо. Я планирую начать с csv, поэтому использую этот код для чтения csv в формате, с которого вы начинаете:

 reader = csv.DictReader(open('file.csv'))

df_Topics = {}
for row in reader:
    for column, value in row.items():  # consider .iteritems() for Python 2
        if value !='': 
            df_Topics.setdefault(column, []).append(value)
print(df_Topics)