У меня есть датафрейм 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'])
Может ли кто-нибудь сказать мне, как это решить?





Сначала создайте столбец 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
@astroluv - да, точно, если значение не существует, создается отсутствующее значение. При необходимости последним шагом должен быть df['Location'] = df['Location'].fillna('not exist location') для замены NaN на строку.
106, если isna(ключ).любой(): --> 107 поднять ValueError('невозможно индексировать вектор, содержащий ' 108 «Значения NA / NaN») 109 вернуть Ложь
ValueError: невозможно индексировать вектор, содержащий значения NA/NaN
у меня выше ошибка
Привет Авани! Если у вас возникли проблемы с принятым ответом, вы можете запросить дополнительную информацию в разделе комментариев к этому ответу или даже задать вопрос непосредственно в Stack Overflow.
Спасибо за помощь. Что, если ключевого слова «Местоположение» нет в списке, что тогда произойдет?? Это поставит "NAN" там?? @jezrael