#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()