动态删除单词的一部分

时间:2019-03-26 07:46:17

标签: python pandas

我的单词由xy两部分组成,其中x可以取多个值,而y可以为空或可以为固定数字值。

x就像:Apple, Banana, Mango, .... many more

y就像:Buy, Sell, Good

单词是:AppleBuy, BananaGood, Mango, MangoSell

输入df

Name
AppleBuy
BananaGood
Mango
MangoSell
Apple Buy

预期DF

Name
Apple
Banana
Mango
Mango
Apple

代码:

df['Name'] = df['Name'].str.replace('AppleBuy','Apple').str.replace('BananaGood','Banana')

问题

上面的代码工作正常,但问题是如果明天有新的x出现,则上面的代码将失败。

我可以有一些动态的东西来获得预期的输出,而不管x的值如何。

5 个答案:

答案 0 :(得分:1)

使用Series.str.replaceSeries.str.extract

y = ['Buy','Sell','Good']
df['Name'] = df['Name'].str.replace('|'.join(y), '').str.strip()
print (df)
     Name
0   Apple
1  Banana
2   Mango
3   Mango

或者:

x = ['Apple','Banana','Mango']
df['Name'] = df['Name'].str.extract('(' + '|'.join(x) + ')', expand=False)

print (df)
     Name
0   Apple
1  Banana
2   Mango
3   Mango

如果需要使用大写分隔符的值:

df['Name'] = df['Name'].str.extract('([A-Z][a-z]*)')

print (df)
     Name
0   Apple
1  Banana
2   Mango
3   Mango

答案 1 :(得分:1)

尝试使用:

df['Name'] = df['Name'].str.extract('([A-Z].*?\w+(?=[A-Z]){2})').str.strip().fillna(df['Name'])
print(df)

输出:

     Name
0   Apple
1  Banana
2   Mango
3   Mango

答案 2 :(得分:0)

list_X = ['AppleBuy', 'BananaGood', 'Mango', 'MangoSell']
list_Y = ['Buy', 'Sell', 'Good']

for index, x in enumerate(list_X):
    for y in list_Y:
        if x.lower().endswith(y.lower()):
            list_X[index] = x.replace(y, '')

print(list_X)
['Apple', 'Banana', 'Mango', 'Mango']

答案 3 :(得分:0)

如果可以使用正则表达式,则可以使用以下命令:

[re.search('^[A-Z][a-z]*', i)[0] for i in df['name']]

答案 4 :(得分:0)

x = "Apple, Banana, Mango, Good"
y = "Buy, Sell, Good"
print(set((i.strip() for i in x.split(',') if len(i.strip())>0)) - set((i.strip() for i in y.split(',') if len(i.strip())>0)))

无序集合。