Как извлечь ключевое слово (строку) из столбца в фрейме данных pandas в python

У меня есть датафрейм df, и он выглядит так:

         id                        Type                        agent_id  created_at
0       44525   Stunning 6 bedroom villa in New Delhi               184  2018-03-09
1       44859   Villa for sale in Amritsar                          182  2017-02-19
2       45465   House in Faridabad                                  154  2017-04-17
3       50685   5 Hectre land near New Delhi                        113  2017-09-01
4      130728   Duplex in Mumbai                                    157  2017-02-07
5      130856   Large plot with fantastic views in Mumbai           137  2018-01-16
6      130857   Modern Design Penthouse in Bangalore                199  2017-03-24

У меня есть эти табличные данные, и я пытаюсь очистить эти данные, извлекая ключевые слова из столбца и, следовательно, создавая новый фрейм данных с новыми столбцами.

Apartment  = ['apartment', 'penthouse', 'duplex']
House      = ['house', 'villa', 'country estate']
Plot       = ['plot', 'land']
Location   = ['New Delhi','Mumbai','Bangalore','Amritsar']

Итак, желаемый фрейм данных должен выглядеть так:

         id      Type        Location    agent_id  created_at
0       44525   House       New Delhi         184  2018-03-09
1       44859   House        Amritsar         182  2017-02-19
2       45465   House       Faridabad         154  2017-04-17
3       50685   Plot        New Delhi         113  2017-09-01
4      130728   Apartment      Mumbai         157  2017-02-07
5      130856   Plot           Mumbai         137  2018-01-16
6      130857   Apartment   Bangalore         199  2017-03-24

Итак, до сих пор я пробовал это:

import pandas as pd
df = pd.read_csv('test_data.csv')

#i can extract these keywords one by one by using for loops but how
#can i do this work in pandas with minimum possible line of code.

for index, values in df.type.iteritems():
  for i in Apartment:
     if i in values:
         print(i)

df_new = pd. Dataframe(df['id'])

Может ли кто-нибудь сказать мне, как это решить?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
5 848
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала создайте столбец Location с помощью str.extract с | для регулярного выражения OR:

pat = '|'.join(r"\b{}\b".format(x) for x in Location)
df['Location'] = df['Type'].str.extract('('+ pat + ')', expand=False)

Затем создайте словарь из другого list, поменяйте местами ключи со значениями и в цикле установите значение по маске с str.contains и параметром case=False:

d = {'Apartment' : Apartment,
     'House' : House,
     'Plot' : Plot}

d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}

for k, v in d1.items():
    df.loc[df['Type'].str.contains(k, case=False), 'Type'] = v

print (df)
       id       Type  agent_id  created_at   Location
0   44525      House       184  2018-03-09  New Delhi
1   44859      House       182  2017-02-19   Amritsar
2   45465      House       154  2017-04-17        NaN
3   50685       Plot       113  2017-09-01  New Delhi
4  130728  Apartment       157  2017-02-07     Mumbai
5  130856       Plot       137  2018-01-16     Mumbai
6  130857  Apartment       199  2017-03-24  Bangalore

Спасибо за помощь. Что, если ключевого слова «Местоположение» нет в списке, что тогда произойдет?? Это поставит "NAN" там?? @jezrael

astroluv 30.01.2019 13:52

@astroluv - да, точно, если значение не существует, создается отсутствующее значение. При необходимости последним шагом должен быть df['Location'] = df['Location'].fillna('not exist location') для замены NaN на строку.

jezrael 30.01.2019 13:54

106, если isna(ключ).любой(): --> 107 поднять ValueError('невозможно индексировать вектор, содержащий ' 108 «Значения NA / NaN») 109 вернуть Ложь

ValueError: невозможно индексировать вектор, содержащий значения NA/NaN

у меня выше ошибка

Привет Авани! Если у вас возникли проблемы с принятым ответом, вы можете запросить дополнительную информацию в разделе комментариев к этому ответу или даже задать вопрос непосредственно в Stack Overflow.

hkoosha 09.11.2019 19:55

Другие вопросы по теме