Pandas - пропустить количество строк в массиве - PullRequest
0 голосов
/ 04 декабря 2018

Рассмотрим 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 голосов
/ 04 декабря 2018

Вместо удаления строк, которые вы хотите пропустить, рассмотрите строки, которые вы хотите сохранить .Вы можете сделать это с помощью 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.Чтобы использовать индекс метки , используйте взамен loc.

Если вам нужно все строк после последнего указанного индекса, вы можете использовать:

np.r_[idx, idx[-1]+1: len(df.index)]
0 голосов
/ 04 декабря 2018

Обновление этого ответа, потому что было разъяснено, что все строки после последнего "шкипера" должны быть взяты.

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...