我正在尝试仅从名称列中提取产品 下面。我正在努力寻找适合的正则表达式模式,甚至可能是命名实体识别,但是这是全部上限,我认为复杂的nlp解决方案不适合这样做。 如果有某种正则表达式模式可以提取日期和城市之间的所有内容,这就是我的目标。理想输出示例如下:
# example of our dataframe
data = {'Names':['02/25 APPLE AIR PODS LOS ANGELES CA',
'01/31 AMAZON PRIME VIDEO MIAMI FL',
'05/14 SAMSUNG TV NASHVILLE TN']}
# Convert Dictionary to Dataframe
df = pd.DataFrame(data)
df output expected
names:
APPLE AIR PODS
AMAZON PRIME VIDEO
SAMSUNG TV
答案 0 :(得分:1)
以下内容删除了城市的日期,州和一个单词。
l=data['Names']
l=[i.replace(' ', ' ') for i in l] #there are some double spaces
m=[' '.join(i.split(' ')[1:-2]) for i in l]
print(m)
输出:
['APPLE AIR PODS LOS', 'AMAZON PRIME VIDEO', 'SAMSUNG TV']
如果要使用数据框格式:
df=pd.DataFrame({'Names':m})
print(df)
Names
0 APPLE AIR PODS LOS
1 AMAZON PRIME VIDEO
2 SAMSUNG TV
当城市名称包含2个单词时,结果的最后一个单词将是某个城市的第一个单词,必须将其删除。我们必须有一个清单来检查它。例如,如果您的城市是cities=['SAN FRANSISCO', 'LOS ANGELES', 'NEW YORK', 'NASHVILLE', 'MIAMI']
,则可以使用首字母为2个字长的城市创建一个新列表,然后进行比较,如下所示:
two_words=[i for i in cities if len(i.split(' '))>1]
first_of_two_words=[i.split(' ')[0] for i in two_words]
#result将是 最后,您可以检查m列表中的最后一个单词,并删除是否在first_of_two_words中:
for i in range(len(m)):
if i.split(' ')[-1] in first_of_two_words:
m=[' '.join(i.split(' ')[-1]) for i in m]
最终密码:
l=data['Names']
cities=['SAN FRANSISCO', 'LOS ANGELES', 'NEW YORK', 'NASHVILLE', 'MIAMI']
two_words=[i for i in cities if len(i.split(' '))>1]
first_of_two_words=[i.split(' ')[0] for i in two_words]
l=[i.replace(' ', ' ') for i in l] #there are some double spaces
m=[' '.join(i.split(' ')[1:-2]) for i in l]
for i in range(len(m)):
if m[i].split(' ')[-1] in first_of_two_words:
m[i]=' '.join(m[i].split(' ')[:-1])
df=pd.DataFrame({'Names':m})
print(df)
输出:
Names
0 APPLE AIR PODS
1 AMAZON PRIME VIDEO
2 SAMSUNG TV