【问题标题】:Remove a list of provided letters from the start of the string从字符串的开头删除提供的字母列表
【发布时间】:2019-05-27 08:44:12
【问题描述】:

我有一个 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')

现在的问题是我有一个超过 100 万列值的数据框。 我的代码没有优化好?如何获得优化的解决方案?

问题 1: 我可以理解我使用了 2 个循环(1 个用于 remove_letters,其他用于所有列值)导致速度变慢。

有没有更好的方法?我可以在哪里检查列值是否以 remove_letters 列表中提到的字母开头并一次性删除它们?

问题 2 和 3: 函数的目标是什么 - “remove_strings”: 仅从列名中获取 2 个字符串。例如:ASEEL ELECTRONICS T 输出将是:ASEEL ELECTRONICS

函数有没有更快的方法:remove_strings,remove_end_digits

主要问题:这三个功能可以同时完成吗?

预期的数据框:

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

注意:函数“remove_start_words”应检查是否有任何提到的字母以“名称”开头,如果是,请删除它们。 例如:“AL THEMAX”应该是“THEMAX”而不是“MAX”(同时删除 AL 和 THE)

提前致谢。

【问题讨论】:

  • str.lstrip怎么样?

标签: python regex python-3.x string


【解决方案1】:

既然你说你只想从句子的开头删除单词,你可以使用正则表达式:

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))

regular_expression 表达式变量将包含 ^THE|AL 在这种情况下表示字符串开头的 THE 或 AL。

【讨论】:

  • 感谢它所说的使用“lamda”功能不是优化的做事方式。但我喜欢你的回答。有没有其他方法可以使用它来避免 lamda ?另外我的问题是如何一次性使用我的所有功能?所有答案都只针对我的一项功能
  • @pyds_learner 我不知道您在哪里听说使用 lambdas 不是一个好主意,但如果您在必要时使用它们,它们完全没问题,而这个完全没问题。此外,为您喜欢的答案投票可能是个好主意。
  • 使用 apply+ lambda 比使用其他 str 函数要慢,但在您的情况下,没有预定义的函数可以完全完成这项工作,使用 lambda 比遍历列表 2-3 次要快得多.
【解决方案2】:

你可以像这样使用替换方法:

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)

【讨论】:

  • 谢谢,朋友们,我正在寻找解决问题的方法。如果列值为“AL THEMAX”,则上述解决方案也应为“THEMAX”。但输出是“MAX”它在循环中删除了 AL 和 THE
【解决方案3】:

在 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'])

应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多