假设我有一个数据帧df,如下所示:
irrelevant location
0 1 0
1 2 0
2 3 1
3 4 3
如何创建一个新的true / false列“ neighbor”,以指示“ location”列中其他位置是否存在“ location” +/- 1(正负1)中的值。这样:
irrelevant location neighbor
0 1 0 True
1 2 0 True
2 3 1 True
3 4 3 False
最后一行将为false,因为df.location列中的任何位置都不会出现2或4。
我已经尝试过这些:
>>> df['neighbor']=np.where((df.location+1 in df.location.unique())|(df.location-1 in df.x.unique()), True, False)
ValueError: Lengths must match to compare
>>> df['tmp']=np.where((df.x+1 in df.x.tolist())|(df.x-1 in df.x.tolist()), 'true', 'false')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
或者,在此先感谢您的帮助,以帮助我定向到所提问题的早期情况(我似乎没有合适的词汇来找到它们)。
答案 0 :(得分:3)
要在列中的任何位置查找邻居,请创建所有邻居值的列表,然后选中isin
。
import numpy as np
vals = np.unique([df.location+1, df.location-1])
#array([-1, 0, 1, 2, 4], dtype=int64)
df['neighbor'] = df['location'].isin(vals)
# irrelevant location neighbor
#0 1 0 True
#1 2 0 True
#2 3 1 True
#3 4 3 False
正因为如此,pd.merge_asof
也可以通过设置容差来找到邻居。我们评估True的值,如果存在邻居,则将其合并。否则,将其保留为NaN,合并后我们将其填充为False。
(pd.merge_asof(df,
df[['location']].assign(neighbor=True),
on='location',
allow_exact_matches=False, # Don't match with same value
direction='nearest', # Either direction
tolerance=1) # Within 1, inclusive
.fillna(False))
答案 1 :(得分:1)
您只需要一点修复:
df['neighbor']=np.where(((df['location']+1).isin(df['location'].unique()))|((df['location']-1).isin(df['location'].unique())), True, False)