我正在使用for循环来创建一个函数,通过查看每行中的方向值,返回基于条件的方向。我已将整个数据集拆分为两个。我在用:
def dir_func(df):
for i in df.index:
if df.loc[i,'dir_1'] == ['E' or 'NE' or 'SE']:
df.loc[i,'dir_fin'] = 'E'
elif df.loc[i,'dir_1'] == ['W' or 'NW' or 'SW']:
df.loc[i,'dir_fin'] = 'W'
else:
if df.loc[i,'dir_2'] == ['E' or 'NE' or 'SE']:
df.loc[i,'dir_fin'] = 'E'
elif df.loc[i,'dir_2'] == ['W' or 'NW' or 'SW']:
df.loc[i,'dir_fin'] = 'W'
else:
if (pd.Series(df.loc[i,'loc_01']).str.contains(
("\sEB\s" or "\sEast\s" or "\sEastbound" or "\sE\s"),case=False) \
| pd.Series(speed_overspeed.loc[i,'loc_02']).str.contains(
("\sEB\s" or "\sEast\s" or "\sEastbound" or "\sE\s"),case=False)).bool()==True:
df.loc[i,'dir_fin'] = 'E'
elif (pd.Series(df.loc[i,'loc_01']).str.contains(
("\sWB\s" or "\sWest\s" or "\sWestbound" or "\sW\s"),case=False) \
| pd.Series(speed_overspeed.loc[i,'loc_02']).str.contains(
("\sWB\s" or "\sWest\s" or "\sWestbound" or "\sW\s"),case=False)).bool()==True:
df.loc[i,'dir_fin'] = 'W'
else:
df.loc[i,'dir_fin'] = 'NA'
迭代。
此函数适用于我的第一个分割数据集,但当我尝试将其应用于第二个数据集时,它返回:
KeyError:'标签[891]不在[index]中
但是,当我查看#891值时,它实际上返回一个带有值的行。
我想知道是否有人可以帮我解决这个问题,我将非常感激。
非常感谢!
我认为你应该理解(在python 3.x中)的结果
df.loc[i,'dir_1'] == ('E' or 'NE' or 'SE')
除非df.loc [i,'dir_1']实际上等于'E',否则总是会是False
因此,if
语句应该改为类似的
if df.loc[i,'dir_1'] in ['E', 'NE', 'SE']:
同样,您可以在最后一个比较语句中使用in
。
最终的功能是:
def dir_func(df):
for i in df.index:
if df.loc[i,'dir_1'] in ['E', 'NE', 'SE']:
df.loc[i,'dir_fin'] = 'E'
elif df.loc[i,'dir_1'] in ['W', 'NW', 'SW']:
df.loc[i,'dir_fin'] = 'W'
else:
if df.loc[i,'dir_2'] in ['E', 'NE', 'SE']:
df.loc[i,'dir_fin'] = 'E'
elif df.loc[i,'dir_2'] in ['W', 'NW', 'SW']:
df.loc[i,'dir_fin'] = 'W'
else:
if (df.loc[i,'loc_01'].lower() in ("\seb\s", "\seast\s", "\seastbound", "\se\s")) or (speed_overspeed.loc[i,'loc_02'] in ("\seb\s", "\seast\s", "\seastbound", "\se\s")):
df.loc[i,'dir_fin'] = 'E'
elif (df.loc[i,'loc_01'].lower() in ("\swb\s", "\swest\s", "\swestbound", "\sw\s")) or (speed_overspeed.loc[i,'loc_02'] in ("\swb\s", "\swest\s", "\swestbound", "\sw\s")):
df.loc[i,'dir_fin'] = 'W'
else:
df.loc[i,'dir_fin'] = 'NA'