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