我有一个数据框“ trial_df”,其列值如下:
Names
GHAITHA & AL MOOSA
ASEEL ELECTRONICS T
SUNRISE SUPERMARKET-QU
EMARAT-AL SAFIYAH(6735
LULU CENTRE LLC EFT TE
MAX
THEMAX
THE LULU
GHAITHA 123
SUNRISE %$#
要求:
1)仅提取空格和特殊字符前后的字符串。
例如:“ ASEEL ELECTRONICS T”将变为“ ASEEL ELECTRONICS
2)但仅在以下情况下:
a)第二个字符串长度应大于2
b)第二个字符串应为字母数字
例如:“ GHAITHA&AL MOOSA”将只是“ GHAITHA”,因为空格后的第二个字符串是“&”(两个条件均失败:非字母数字且长度不大于2)
例如:'MAX'将是'MAX',因为它只有一个字符串。同样,“ THE LULU”将与已经只有2个字符串的字符串相同。
最终输出:
Names
GHAITHA
ASEEL ELECTRONICS
SUNRISE SUPERMARKET-QU
EMARAT
LULU CENTRE
MAX
THEMAX
THE LULU
GHAITHA
SUNRISE
我要执行的功能:
def remove_strings(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]
#calling my function
remove_strings(df=trial_df, col='Names')
我的功能有问题:虽然可以解决要求,但优化效果不佳。 我的数据超过一百万行,因此它循环很多次非常耗时。 有没有一种很好的优化方法来解决我的要求?
答案 0 :(得分:0)
我们可能希望在此处设计的表达式非常复杂。也许,最好是分解一下任务,然后设计更简单的表达式。例如,在我们通过正则表达式引擎运行THE LULU
大小写之前,可以简单地排除这种情况。
我对表达式的部分尝试是:
^([A-Z\s]{3,}?)(&.+|\s[A-Z]{1}$|-.+|\s[A-Z]{3}\s.+|\s[0-9].+|\s[~!@#$%^&*]+.+)$
但是,我非常确定它在我们可能没有在此处列出的其他输入中不会起作用。
该想法将分三个步骤:
^([A-Z\s]{3,}?)
答案 1 :(得分:0)
df.Names.replace(regex=r'^(\w+)(\s[A-Z-]{2,})?.*',value=r'\1\2')
Out[186]:
0 GHAITHA
1 ASEEL ELECTRONICS
2 SUNRISE SUPERMARKET-QU
3 EMARAT
4 LULU CENTRE
5 MAX
6 THEMAX
7 THE LULU
8 GHAITHA
9 SUNRISE
Name: Names, dtype: object