熊猫-跳过numpy数组中给定的行数

时间:2018-12-04 09:44:37

标签: python pandas numpy dataframe indexing

考虑一个pandas数据帧,任务是跳过NumPy数组中给出的行数。

例如,举这个例子:

# NumPy array    
arr = np.array([2, 5, 1, 3])
arr
array([2, 5, 1, 3])

# Pandas dataframe
df = pd.DataFrame({'num': [18, 2, 32, 8, 9, 6645, 2, 4, 5, 688, 99, 5, 2, 223, 33, 85],
                    'val':['f','a','r', 's', 't', 'x', 'l', 'y', 'yy', 'gg', 's', 'ss', 'tt', 'qq', 'p', 'aa']})

df

   num  val
0   18  f
1   2   a
2   32  r
3   8   s
4   9   t
5   6645    x
6   2   l
7   4   y
8   5   yy
9   688 gg
10  99  s
11  5   ss
12  2   tt
13  223 qq
14  33  p
15  85  aa

预期输出:

   num  val
2   32  r
8   5   yy
10  99  s
14  33  p
15  85  aa

2 个答案:

答案 0 :(得分:4)

考虑删除要保留的行,而不是删除要跳过的行。您可以使用NumPy进行此操作,利用np.r_将带有标量的切片组合在一起:

idx = arr.cumsum() + np.arange(len(arr))

res = df.iloc[np.r_[idx, idx[-1]+1]]

print(res)

    num val
2    32   r
8     5  yy
10   99   s
14   33   p
15   85  aa

请注意,我们仅使用iloc位置索引是因为您的输入数据框具有常规的pd.RangeIndex。要使用索引 labels ,请改用loc

如果在最后指定的索引之后需要所有行,则可以使用:

np.r_[idx, idx[-1]+1: len(df.index)]

答案 1 :(得分:2)

更新此答案,因为已阐明必须在最后一个“船长”之后的所有行。

>>> rows = np.array([2, 5, 1, 3])
>>> rows = rows.cumsum() + np.arange(len(rows))
>>> 
>>> pd.concat([df.iloc[rows], df.iloc[rows[-1] + 1:]])
    num val
2    32   r
8     5  yy
10   99   s
14   33   p
15   85  aa