考虑一个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
答案 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