【发布时间】: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