从不在列表中的列中提取单词并创建新列
Extracting words from a column that are not in list and creating new column
我想从列中的字符串值中提取特定的子字符串。在下面的代码中,您会看到我已设法提取年份、品牌和型号。
import pandas as pd
import numpy as np
data = [['year_make_model'],
['1970 Plymouth Hemi Cuda'],
['1970 Dodge Challenger R/T SE Convertible'],
['1971 Plymouth Cuda']]
data = pd.DataFrame(data[1:], columns=data[0])
def create_year_make_model(df):
df['year'] = df.year_make_model.str.extract('(\d\d\d\d)', expand=True)
df['make'] = np.where(df.year_make_model.str.contains('Plymouth'), 'Plymouth',
np.where(df.year_make_model.str.contains('Dodge'), 'Dodge', 'Nan'))
df['model'] = np.where(df.year_make_model.str.contains('Cuda'), 'Cuda',
np.where(df.year_make_model.str.contains('Challenger'), 'Challenger', 'Nan'))
return df.head()
create_year_make_model(data)
year_make_model year make model
0 1970 Plymouth Hemi Cuda 1970 Plymouth Cuda
1 1970 Dodge Challenger R/T SE Convertible 1970 Dodge Challenger
2 1971 Plymouth Cuda 1971 Plymouth Cuda
现在我需要提取所有剩余的单词(如果有的话)。剩下的词组成了车辆'type'(见下面的例子)。
car_type = ['Hemi', 'R/T SE Convertible', None]
data['type'] = car_type
data
year_make_model year make model type
0 1970 Plymouth Hemi Cuda 1970 Plymouth Cuda Hemi
1 1970 Dodge Challenger R/T SE Convertible 1970 Dodge Challenger R/T SE Convertible
2 1971 Plymouth Cuda 1971 Plymouth Cuda None
到目前为止,我已经尝试了很多不同的方法,但都没有成功。我尝试过的一种方法是为所有年份、品牌和型号组合创建一个列表 word_list = ['Cuda','Challenger','1970','1971','Dodge','Plymouth']
。然后我做了一个 for 循环,试图提取列 'year_make_model' 中不在 word_list 中的单词,但我无法让它工作。我希望有人知道解决我的问题的必要技巧,在此先感谢!
我不确定这是否是解决问题的最佳方法,但它确实有效:
import numpy as np
import pandas as pd
data = [['year_make_model'],
['1970 Plymouth Hemi Cuda'],
['1970 Dodge Challenger R/T SE Convertible'],
['1971 Plymouth Cuda']]
data = pd.DataFrame(data[1:], columns=data[0])
def create_year_make_model(df):
cell_text = df.year_make_model.str
df['year'] = cell_text.extract('(\d\d\d\d)', expand=True)
df['make'] = np.where(cell_text.contains('Plymouth'), 'Plymouth',
np.where(cell_text.contains('Dodge'), 'Dodge', 'Nan'))
df['model'] = np.where(cell_text.contains('Cuda'), 'Cuda',
np.where(cell_text.contains('Challenger'), 'Challenger', 'Nan'))
# what fields to remove
rm_fields = ["year", "make", "model"]
for field in rm_fields:
# remove this field
for val in getattr(df, field).values:
cell_text = cell_text.replace(str(val), "").str
# clean any leading/trailing spaces
cell_text = cell_text.replace(r"^\s+", "")
cell_text = cell_text.replace(r"\s+$", "")
df['type'] = cell_text
return df.head()
print(create_year_make_model(data))
因此,在提取年份、品牌和型号字段后,您可以返回并获取这些字段的提取值,并将它们替换为空格。
为了保持一致性,还应删除任何可能的 leading/trailing 空格。
我想从列中的字符串值中提取特定的子字符串。在下面的代码中,您会看到我已设法提取年份、品牌和型号。
import pandas as pd
import numpy as np
data = [['year_make_model'],
['1970 Plymouth Hemi Cuda'],
['1970 Dodge Challenger R/T SE Convertible'],
['1971 Plymouth Cuda']]
data = pd.DataFrame(data[1:], columns=data[0])
def create_year_make_model(df):
df['year'] = df.year_make_model.str.extract('(\d\d\d\d)', expand=True)
df['make'] = np.where(df.year_make_model.str.contains('Plymouth'), 'Plymouth',
np.where(df.year_make_model.str.contains('Dodge'), 'Dodge', 'Nan'))
df['model'] = np.where(df.year_make_model.str.contains('Cuda'), 'Cuda',
np.where(df.year_make_model.str.contains('Challenger'), 'Challenger', 'Nan'))
return df.head()
create_year_make_model(data)
year_make_model year make model
0 1970 Plymouth Hemi Cuda 1970 Plymouth Cuda
1 1970 Dodge Challenger R/T SE Convertible 1970 Dodge Challenger
2 1971 Plymouth Cuda 1971 Plymouth Cuda
现在我需要提取所有剩余的单词(如果有的话)。剩下的词组成了车辆'type'(见下面的例子)。
car_type = ['Hemi', 'R/T SE Convertible', None]
data['type'] = car_type
data
year_make_model year make model type
0 1970 Plymouth Hemi Cuda 1970 Plymouth Cuda Hemi
1 1970 Dodge Challenger R/T SE Convertible 1970 Dodge Challenger R/T SE Convertible
2 1971 Plymouth Cuda 1971 Plymouth Cuda None
到目前为止,我已经尝试了很多不同的方法,但都没有成功。我尝试过的一种方法是为所有年份、品牌和型号组合创建一个列表 word_list = ['Cuda','Challenger','1970','1971','Dodge','Plymouth']
。然后我做了一个 for 循环,试图提取列 'year_make_model' 中不在 word_list 中的单词,但我无法让它工作。我希望有人知道解决我的问题的必要技巧,在此先感谢!
我不确定这是否是解决问题的最佳方法,但它确实有效:
import numpy as np
import pandas as pd
data = [['year_make_model'],
['1970 Plymouth Hemi Cuda'],
['1970 Dodge Challenger R/T SE Convertible'],
['1971 Plymouth Cuda']]
data = pd.DataFrame(data[1:], columns=data[0])
def create_year_make_model(df):
cell_text = df.year_make_model.str
df['year'] = cell_text.extract('(\d\d\d\d)', expand=True)
df['make'] = np.where(cell_text.contains('Plymouth'), 'Plymouth',
np.where(cell_text.contains('Dodge'), 'Dodge', 'Nan'))
df['model'] = np.where(cell_text.contains('Cuda'), 'Cuda',
np.where(cell_text.contains('Challenger'), 'Challenger', 'Nan'))
# what fields to remove
rm_fields = ["year", "make", "model"]
for field in rm_fields:
# remove this field
for val in getattr(df, field).values:
cell_text = cell_text.replace(str(val), "").str
# clean any leading/trailing spaces
cell_text = cell_text.replace(r"^\s+", "")
cell_text = cell_text.replace(r"\s+$", "")
df['type'] = cell_text
return df.head()
print(create_year_make_model(data))
因此,在提取年份、品牌和型号字段后,您可以返回并获取这些字段的提取值,并将它们替换为空格。
为了保持一致性,还应删除任何可能的 leading/trailing 空格。