我的单词由x
和y
两部分组成,其中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的值如何。
答案 0 :(得分:1)
使用Series.str.replace
或Series.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)))
无序集合。