Python 如何通过识别模式来替换具有不同名称的列的条目?
我有一个专栏,比如说,Python 如何通过识别模式来替换具有不同名称的列的条目?,python,string,pandas,Python,String,Pandas,我有一个专栏,比如说,'Match Place',里面有诸如'MANU@POR','MANU vs.UTA','MANU@IND','MANU vs.GRE'等条目。所以我的专栏有三个条目,第一个名字是MANU,即第一个国家代码,第二个是@/vs.,第三个是第二个国家名称。所以我想做的是,如果“@”出现在我专栏的任何条目中,我想把它改成“远离”,如果“vs.出现,把整个条目改成“home”,比如“MANU@POR”应该改成“远离”,“MANU vs.GRE”应该改成“home” 虽然我用for、
'Match Place'
,里面有诸如'MANU@POR'
,'MANU vs.UTA'
,'MANU@IND'
,'MANU vs.GRE'
等条目。所以我的专栏有三个条目,第一个名字是MANU
,即第一个国家代码,第二个是@/vs.
,第三个是第二个国家名称。所以我想做的是,如果“@”
出现在我专栏的任何条目中,我想把它改成“远离”
,如果“vs.
出现,把整个条目改成“home”
,比如“MANU@POR”应该改成“远离”
,“MANU vs.GRE”应该改成“home”
虽然我用for、if、else编写了一些代码来实现这一点,但是计算它花费的时间太长了,我的总行数是30697
那么有没有其他方法来缩短时间呢
下面我给你看我的代码
请帮忙
您可以使用检查字符串是否包含@
,然后使用相应地填充值。例如:
>>> df
match
0 MANU @ POR
1 MANU vs. UTA
2 MANU @ IND
3 MANU vs. GRE
>>> df['match'].str.contains('@').map({False: 'home', True: 'away'})
0 away
1 home
2 away
3 home
Name: match, dtype: object
使用np.where to with contains检查是否存在任何子字符串
import numpy as np
df = pd.DataFrame(data={"col1":["manu vs. abc","manu @ pro"]})
df['type'] = np.where(df['col1'].str.contains("@"),"away","home")
您可以使用来指定多个条件:
s=df['Match Place'].str.split().str[1] #select the middle element
c1,c2=s.eq('@'),s.eq('vs.') #assign conditions
np.select([c1,c2],['away','home']) #assign this to the desired column
#array(['away', 'home', 'away', 'home'], dtype='<U11')
s=df['Match Place'].str.split().str[1]#选择中间的元素
c1,c2=s.eq('@'),s.eq('vs.)#分配条件
np.选择([c1,c2],“离开”,“回家])#将其分配给所需的列
#数组(['away'、'home'、'away'、'home'],dtype='替换的有趣用法
更多信息检查
由于您的第一个单词始终是MANU,所以字符串的第六个元素包含“@”或“v”。您可以使用check df['home/away'][i][5]来加快进程,而不是使用split。
col1 type
0 manu vs. abc home
1 manu @ pro away
s=df['Match Place'].str.split().str[1] #select the middle element
c1,c2=s.eq('@'),s.eq('vs.') #assign conditions
np.select([c1,c2],['away','home']) #assign this to the desired column
#array(['away', 'home', 'away', 'home'], dtype='<U11')
df['match'].replace({'@':0},regex=True).astype(bool).map({False: 'away', True: 'home'})
0 away
1 home
2 away
3 home
Name: match, dtype: object