Удаление по мультииндексам
Есть DataFrame:
Выбираю подмножество индексов, соответствующих HEATID_id = 1079571:
data.loc[1079571], получаю список индексов этого DataFrame:
ind = data.loc[1079571].index
Хочу удалить элемент с индексом '2020-03-20 12:57:00', соответствующий ind[0] из исходного DataFrame, делаю это так: data.loc[1079571].drop(ind[0], inplace=True), но элемент в исходной data остается на месте.
Я знаю, что, если напишу data.drop((1079571, '2020-03-20 12:57:00'), inplace=True) -- элемент удалится,
но я прохожу циклом по DataFrame и по некоторому условию должна удалять подындексы с датой, принадлежащие некоторым ID.
Как правильно это сделать?
Пример данных:
ind = [np.array([1, 1, 2, 2, 3, 3, 4, 4]),
np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame(np.random.randn(8, 3), index=ind, columns=['col1', 'col2', 'col3'])
Ответы (1 шт):
Сначала, для удобства, я дам имена столбцам мультииндекса:
In [6]: df = df.rename_axis(("HEATID_id", "DATETIME"))
In [7]: df
Out[7]:
col1 col2 col3
HEATID_id DATETIME
1 one -0.273237 0.238934 0.170942
two -1.014915 -1.861040 1.438298
2 one 1.768788 -1.867217 2.228290
two -0.223731 0.510522 -0.339987
3 one -0.692861 0.058985 -1.029659
two -0.914700 -2.383052 -0.423476
4 one -0.983865 1.493552 0.261097
two -1.380589 -0.192062 -0.220487
решение:
переменные задающие значения индекса, по которым будем удалять данные:
In [8]: idx1, idx2 = 1, "two"
получаем значения мультииндекса, соответствующие строкам, которые мы хотим удалить:
In [9]: idx2drop = df.query('HEATID_id == @idx1 and DATETIME == @idx2').index
удаляем строки:
In [10]: res = df.drop(idx2drop)
результат:
In [11]: res
Out[11]:
col1 col2 col3
HEATID_id DATETIME
1 one -0.273237 0.238934 0.170942
2 one 1.768788 -1.867217 2.228290
two -0.223731 0.510522 -0.339987
3 one -0.692861 0.058985 -1.029659
two -0.914700 -2.383052 -0.423476
4 one -0.983865 1.493552 0.261097
two -1.380589 -0.192062 -0.220487
PS данный метод также позволяет работать со списками:
idx1 = [1,4]
idx2 = "two"
idx2drop = df.query('HEATID_id in @idx1 and DATETIME == @idx2').index
res = df.drop(idx2drop)
In [18]: res
Out[18]:
col1 col2 col3
HEATID_id DATETIME
1 one -0.392229 0.150130 -0.870317
2 one -1.383410 0.038539 -1.505904
two 0.783348 0.456165 -2.698035
3 one 2.290064 1.275575 0.055193
two -0.138148 0.730962 -1.987691
4 one -2.215016 0.763966 -1.618045

