Удалить список предоставленных букв из начала строки - PullRequest
0 голосов
/ 27 мая 2019

У меня есть dataframe-df со столбцом «Имена», как показано ниже:

Names
AL GHAITHA & AL MOOSA
AL ASEEL ELECTRONICS T
SUNRISE SUPERMARKET-QU
EMARAT-AL SAFIYAH(6735
LULU CENTRE LLC EFT TE
THE MAX

код:

remove_letters = ['AL ', 'THE ']

# my function below :

def remove_start_words(df, col, letters):
    for l in letters:
        for i in df.index:
            x = df.at[i, col]
            if x.startswith(l):
                df.at[i, col] = x[len(l):]
            else:
                df.at[i, col] = x

def remove_strings(self, df, col):
    for i in df.index:
        x = df.at[i, col]
        x = x.split(' ')
        if len(x) > 1:
            if len(x[1]) > 2:
                x[1] = ''.join(e for e in x[1] if e.isalnum())
                x = ' '.join(x[0:2])
                df.at[i, col] = x
            else:
                df.at[i, col] = x[0]
        else:
            df.at[i, col] = df.at[i, col]


def remove_end_digits(self, df, col):
    for i in df.index:
        x = df.at[i, col]
        df.at[i, col] = x.rstrip(string.digits)

# calling my function
remove_start_words(df=df, col='Names',
                          letters=remove_letters)

remove_strings(df=df, col='Names')
remove_end_digits(df=df, col='Names')

Теперь проблема в том, что у меня есть массив данных, содержащий более 1 миллиона значений столбцов. Мой код не очень хорошо оптимизирован? Как получить оптимизированное решение?

Выпуск 1: Я могу понять, что использовал 2 цикла (1 для remove_letters и другой для всех значений столбца), что вызывает медлительность.

Есть ли лучший способ? где я могу проверить, начинаются ли значения столбца с букв, упомянутых в списке remove_letters, и убрать их одним выстрелом?

Выпуск 2 и 3: Какова цель функции - "remove_strings": Получить только 2 строки из имен столбцов. Например: ASEEL ELECTRONICS T вывод будет: ASEEL ELECTRONICS

Есть ли более быстрый способ для функций: remove_strings, remove_end_digits

Основная проблема: все ли эти 3 функции могут быть выполнены одновременно одним выстрелом?

Ожидаемый фрейм данных:

Names
GHAITHA
ASEEL ELECTRONICS
SUNRISE SUPERMARKET
EMARAT-AL SAFIYAH
LULU CENTRE
MAX

ПРИМЕЧАНИЕ. Функция «remove_start_words» должна проверять, начинаются ли какие-либо из упомянутых букв в «Имена», если так, удалите их. Например, «AL THEMAX» должно быть «THEMAX», а не «MAX» (исключая AL и THE)

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 27 мая 2019

Поскольку вы сказали, что хотите удалить только слова из начала предложения, вы можете использовать регулярное выражение:

import pandas as pd

file_path = 'file3.xlsx'

df = pd.read_excel(file_path)

words_to_remove = ["THE", "AL"]
regular_expression = '^' + '|'.join(words_to_remove)

df.Names = df.Names.apply(lambda x : re.sub(regular_expression, "", x))

переменная выражения регулярного выражения будет содержать ^ THE | AL в этом случае, означая THE илиAL в начале строки.

0 голосов
/ 27 мая 2019

Пару минут поиска в Google говорят мне, что

def stripper(delete_list):
    def delete(item):
        nonlocal delete_list
        for rm in delete_list:
            item = item.lstrip(rm)
        return item
    return delete

df['Names'] = df['Names'].apply(stripper(['AL', 'THE'])

должен сделать свое дело.

0 голосов
/ 27 мая 2019

Вы можете использовать метод замены следующим образом:

import pandas as pd

file_path = 'file3.xlsx'

df = pd.read_excel(file_path)

words_to_remove = ["THE", "AL"]

for word in words_to_remove:
    df.Names = df.Names.str.replace(word, "")

print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...