【问题标题】:Extract Products From Pandas Dataframe Column从 Pandas 数据框列中提取产品
【发布时间】:2020-09-25 01:30:06
【问题描述】:

我正在尝试仅从名称列中提取产品 以下。我正在努力寻找适用于此的正则表达式模式,或者甚至可能是命名实体识别,但这是全部大写,我认为复杂的 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

【问题讨论】:

  • 这很难,你需要找到 city 的名字,然后删除它
  • @BEN_YO 唯一的问题是我的真实数据集有无数个城市......所以我试图找到某种模式。如果我知道所有城市,我可以把它放在一个列表中并删除它,但不幸的是,任何城市都可能这样做......
  • 显而易见的策略是列出城市,看看它们是否属于您的 column=Names (get index and you're dome) 。如果您的列表很大,您的 pandas 工具将无法执行此操作。
  • @adhg 可能是 pyspark,如果列表很大?
  • 添加了一些代码,使其适用于 2words 城市。不要忘记用所有 2word 城市填写列表。如果您不需要所有这些解释,请告诉我,以便我清除答案以仅保留最终代码

标签: python pandas text extract


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2021-01-07
    相关资源
    最近更新 更多