检查给定列中其他任何地方的数据帧值+/- 1是否存在

时间:2019-11-27 11:54:45

标签: python pandas numpy dataframe

假设我有一个数据帧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().

或者,在此先感谢您的帮助,以帮助我定向到所提问题的早期情况(我似乎没有合适的词汇来找到它们)。

2 个答案:

答案 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)