#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)