熊猫:基于2列获取行前后

时间:2017-12-18 20:09:59

标签: python pandas numpy

我正在尝试使用pandas获取存储列中非空的任何记录之前和之后的行。但是,我需要根据Key列对其进行分组,以便它不会从非相关密钥中提取其他记录。

以下是数据:

Store     Key       Time
          1-1-ABC   1pm
1         1-1-ABC   2pm
          1-1-ABC   3pm
2         1-2-BCD   1pm
          1-2-BCD   2pm
          1-2-BCD   3pm
          1-1-CDE   1pm
          1-1-CDE   2pm
          1-1-CDE   3pm
3         1-1-CDE   4pm
4         2-1-EFG   1pm
          2-1-EFG   2pm
          2-1-EFG   3pm
5         1-3-LMN   1pm
          1-3-LMN   2pm
          1-3-LMN   3pm

结果应如下所示:

Store     Key       Time
          1-1-ABC   1pm
 1        1-1-ABC   2pm
          1-1-ABC   3pm
 2        1-2-BCD   1pm
          1-2-BCD   2pm
          1-1-CDE   3pm
 3        1-1-CDE   4pm
 4        2-1-EFG   1pm
          2-1-EFG   2pm
 5        1-3-LMN   1pm
          1-3-LMN   2pm

1 个答案:

答案 0 :(得分:1)

使用numpy clip + concatenate

l=[]
for _,df1 in df.groupby('Key'):

    idx=df1.Store.replace('',np.nan).notnull().nonzero()[0]
    l.append(df1.iloc[np.unique(np.clip(np.concatenate(np.array([idx-1,idx,idx+1])),0,len(df1)-1))])


pd.concat(l).sort_index()



Out[196]: 
   Store      Key Time
0         1-1-ABC  1pm
1      1  1-1-ABC  2pm
2         1-1-ABC  3pm
3      2  1-2-BCD  1pm
4         1-2-BCD  2pm
8         1-1-CDE  3pm
9      3  1-1-CDE  4pm
10     4  2-1-EFG  1pm
11        2-1-EFG  2pm
13     5  1-3-LMN  1pm
14        1-3-LMN  2pm