Работа с большим набором данных, удаление нежелательных вариантов из названий продуктов - PullRequest
0 голосов
/ 21 января 2019

У меня все еще есть проблема с моим кодом, я не уверен, что еще я мог сделать.Я хочу удалить все варианты из названий продуктов.некоторые из них удаляются, а некоторые нет.Примеры того, что не удаляется, это oz, ml, mg и много слов, которые находятся в файле csv new_words_filtered.Я не уверен, какие другие подходы я мог бы использовать для выполнения этой задачи, я думал о регулярном выражении, но я не знаю всех шаблонов названий продуктов, или, возможно, использую нечеткое соответствие, чтобы найти самую длинную подходящую строку.

Немного о данных, 15 000 + все они - названия продуктов, которые включают такие варианты, как цвет, размер, упаковка и т. Д. Они имеют разную длину, форматы, а некоторые имеют неправильное написание и интервалы.

Янадеясь, что кто-нибудь посмотрит на мой код и, возможно, покажет мне, что я делаю не так, или у вас есть другие способы решения этой проблемы.

`import pandas as pd
 import time

 #file_name= 'new_london.csv'
 file_name= 'london.csv'
 words_filtered = 'new_words_filtered.csv'
 colors = 'more_colors.csv'

df = pd.read_csv(file_name, header=None, 
names=range(150))
colors_df =  pd.read_csv(colors)
words_filtered_df =  pd.read_csv(words_filtered)

def filter_lists(x):
x = str(x).strip()
x = " ".join(x.split())

if x.endswith('/'):
    x = x[:-1].strip()
if x.endswith('.'):
    x = x[:-1].strip()
if x.endswith('/'):
    x = x[:-1].strip()
x = x.strip()
if len(x) < 2:
    return ''
return x.lower()

colors_df = colors_df.applymap(filter_lists)
colors_df.drop_duplicates(inplace=True)
colors_df.dropna(inplace=True)
colors= list(set([ str(i[0]) for i in 
colors_df.values.tolist()]))
colors.append('vanilla')

words_filtered_df.dropna(axis=1, how='all', inplace=True)
words_filtered_df = 
words_filtered_df.applymap(filter_lists)
words_filtered_df.drop_duplicates(inplace=True)
words_filtered = set([ str(i[0]) for i in 
words_filtered_df.values.tolist()])
words_filtered.remove('')
words_filtered = list(words_filtered)

df.columns = df.iloc[0]
df = df.drop(df.index[[0]])
df.fillna('', inplace=True)
d = df['name']

def filter_data_new(x):
x = x.lower().strip()
x = " ".join(x.split())
x = x.strip()
if x.endswith('.'):
    x = x[:-1]
    x = x.strip()
if x.endswith('/'):
    x = x[:-1]
    x = x.strip()
if x.endswith('.'):
    x = x[:-1]
x = x.strip()
for i in colors:
    if x.endswith(i):
        l = len(i)
        x = x[:-l]
        x = x.strip()

x = x.strip().split('-')
x = "-".join([i.strip() for i in x if len(i.strip())])

for i in words_filtered:
    if x.endswith(i):
        x = x.strip()
        l = len(i)
        x = x[:-l]
        x = x.strip()
        break


x = x.strip().split('-')
x = "-".join([i for i in x if len(i.strip())])

for i in words_filtered:
    if x.endswith(i):
        x = x.strip()
        l = len(i)
        x = x[:-l]
        x = x.strip()
        break

x = x.strip().split('-')
x = " -".join([i for i in x if len(i.strip())])
if x.endswith('oz') or x.endswith('ml') :
    x = x[:-2]
    x = x.strip().split()
    x = " ".join(x[:-1])
if x.endswith('jar'):
    x = x[:-3]
    x = x.strip().split()
    x = " ".join(x[:-1])
return x.strip()

y = d.map(filter_data_new)
df['name'] = y 

df.to_csv('london_new'+str(time.time()).replace('.','_')+'.csv', index=False)

1 Ответ

0 голосов
/ 21 января 2019

Код - это беспорядок, например, то, что вы хотите сделать:

if x.endswith('.'):
    x = x[:-1]
    x = x.strip()
if x.endswith('/'):
    x = x[:-1]
    x = x.strip()
if x.endswith('.'):
    x = x[:-1]

Я думаю, вам нужно почистить код, и тогда вы сами найдете решение.Вы, вероятно, смущены всеми этими, если это

...