Python 动态删除单词的一部分

Python 动态删除单词的一部分,python,pandas,Python,Pandas,我的单词由两部分组成,x和y,其中x可以取很多值&y可以是空的,也可以取固定数量的值 x就像:苹果、香蕉、芒果。。。。更多 y就像:买,卖,好 单词是: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

我的单词由两部分组成,
x
y
,其中
x
可以取很多值&
y
可以是空的,也可以取固定数量的值

x就像:
苹果、香蕉、芒果。。。。更多

y就像:
买,卖,好

单词是:
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的值是多少,都能得到预期的输出

使用或:

或:

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

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

print (df)
     Name
0   Apple
1  Banana
2   Mango
3   Mango
尝试使用:

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

如果regex是一个选项,您可以使用如下内容:

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

无序集。

正则表达式是解决这个问题的一个选项吗?应该提取值
x
y
?x和y的首字母总是大写吗?代码以什么方式“失败”?它可以工作,但如果明天有新的东西出现,它将无法处理,比如说
cherrybay
必须转换为
Cherry
。上述操作将失败,因此需要一些动态的东西。公认的答案是这样的!!我在上面的例子中没有包括这一点:但答案是否也可以处理类似于
Apple Buy
变成
Apple
@RahulAgarwal的问题?第二个解决方案有效,因为第一个是必须添加
.str.strip()
我在上面的例子中没有包括这一点:但答案是否也能处理类似于
苹果购买
成为
苹果
我的x是动态的,我不确定有多少。所以,每次我需要将x值更改为我的代码,我的x是动态的,我不知道有多少。所以,每次我需要将x值更改为我的代码
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
[re.search('^[A-Z][a-z]*', i)[0] for i in df['name']]
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)))