我有一个列,假设其中有'MANU @ POR','MANU vs. UTA','MANU @ IND','MANU vs. GRE'等条目。所以我的列有3个条目,第一个名称是MANU,即第一个国家/地区代码,第二个是@/vs.,第三个是第二个国家/地区名称。所以我想做的是,如果'@'出现在我的列的任何条目中,我希望将其更改为'away',如果'vs.'出现,则应将整个条目替换为'home',如'MANU @ POR‘应更改为'away',而'MANU vs. GRE’应更改为'home'
虽然我用for,if,else写了一些代码来做这件事,但是它花了太长的时间来计算它,我的总行是30697,所以有没有其他方法来减少下面的时间,我正在向你展示我的代码,请帮助
for i in range(len(df)):
if is_na(df['home/away'][i]) == True:
temp = (df['home/away'][i]).split()
if temp[1] == '@':
df['home/away'][i] = 'away'
else:
df['home/away'][i] = 'home发布于 2019-07-20 22:55:23
您可以使用np.select来分配多个条件:
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')发布于 2019-07-20 22:48:17
您可以使用 [pandas-doc]检查字符串是否包含@,然后使用 [pandas-doc]填充相应的值。例如:
>>> 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发布于 2019-07-20 22:55:14
使用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") col1 type
0 manu vs. abc home
1 manu @ pro awayhttps://stackoverflow.com/questions/57125740
复制相似问题