Удаление строк из фрейма данных panda с несортированным индексом

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

Вот как выглядят мои данные:

 print(len(y_train),len(index_1))
index_1 = pd.DataFrame(data=index_1)
print("y_train: ")
print(y_train)
print("index_1: ")
print(index_1)
  

Вывод:

 1348 555
y_train: 
1677    1
1519    0
1114    0
690     1
1012    1
       ..
1893    1
1844    0
1027    1
1649    1
1789    1
Name: Team 1 Win, Length: 1348, dtype: int64
index_1: 
        0
0       0
1       2
2       6
3       7
4       8
..    ...
550  1335
551  1341
552  1342
553  1344
554  1346
  

Я хочу удалить несколько строк (index_1) из фрейма данных panda (y_train). Таким образом, значения в index_1 df — это строки, которые я хочу удалить. Проблема в том, что фрейм данных не в порядке, поэтому, когда первый элемент index_1 равен 0, я хочу, чтобы он удалил первую строку в y_train (т. Е. Индекс 1677) вместо строки с индексом 0.
Это моя попытка:

 y_train_short = y_train.drop(index_1)
  

Это то, что я получаю:

 ---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-57-49f2cce7bac0> in <module>
     22 print(index_1)
     23 print(index_1)
---> 24 y_train_short = y_train.drop(index_1)
     25 
     26 

~/miniconda3/lib/python3.7/site-packages/pandas/core/series.py in drop(self, labels, axis, index, columns, level, inplace, errors)
   4137             level=level,
   4138             inplace=inplace,
-> 4139             errors=errors,
   4140         )
   4141 

~/miniconda3/lib/python3.7/site-packages/pandas/core/generic.py in drop(self, labels, axis, index, columns, level, inplace, errors)
   3934         for axis, labels in axes.items():
   3935             if labels is not None:
-> 3936                 obj = obj._drop_axis(labels, axis, level=level, errors=errors)
   3937 
   3938         if inplace:

~/miniconda3/lib/python3.7/site-packages/pandas/core/generic.py in _drop_axis(self, labels, axis, level, errors)
   3968                 new_axis = axis.drop(labels, level=level, errors=errors)
   3969             else:
-> 3970                 new_axis = axis.drop(labels, errors=errors)
   3971             result = self.reindex(**{axis_name: new_axis})
   3972 

~/miniconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in drop(self, labels, errors)
   5016         if mask.any():
   5017             if errors != "ignore":
-> 5018                 raise KeyError(f"{labels[mask]} not found in axis")
   5019             indexer = indexer[~mask]
   5020         return self.delete(indexer)

KeyError: '[0] not found in axis'
  

Независимо от того факта, что индекс 0 не существует в y_train, я полагаю, что если бы он существовал, он не делал бы то, что я хочу, чтобы он делал. Итак, как мне удалить правильные строки из этого фрейма данных?

Ответ №1:

Обратите внимание, что y_train.iloc[index_1[0]] извлекаются строки из y_train, занимающие указанные целочисленные позиции.

При запуске y_train.iloc[index_1[0]].index вы получите индексы этих строк.

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

 y_train.drop(y_train.iloc[index_1[0]].index, inplace=True)
  

Ответ №2:

Вы можете использовать isin для индекса:

 # set index to start from 0
y_train = y_train.reset_index(drop=True)

# do simple filter
y_train = y_train[~y_train.index.isin(index_1[0])].copy()