Как удалить строки по разным условиям?
Есть фрейм данных и мне нужно удалить из него строки, в которых значение столбца А более 50. Эта операция успешно выполняется кодом:
import pandas as pd
import numpy as np
df = pd.DataFrame([[256, 4, 24, 51], [24, 25, 34, 200], [300, 12, 45, 11],
[34, 19, 2, 34], [75, 76, 19, 11], [42, 89, 29, 101], [54, 104, 11, 12]])
df.rename({0: 'A', 1: 'B', 2: 'C', 3: 'D'}, axis=1, inplace=True)
df_without_noise = df.drop(np.where(df['A'] > 250)[0])
и получается
A B C D
1 24 25 34 200
3 34 19 2 34
4 75 76 19 11
5 42 89 29 101
6 54 104 11 12
Потом нужно удалить строки, в которых значения столбца В более 50. Я повторяю операцию, аналогичную первому удалению строк:
df_without_noise = df_without_noise.drop(np.where(df_without_noise['В'] > 50)[0])
но выводит ошибку:
KeyError: '[2] not found in axis'
При этом, в столбце В присутствуют значения более 50.
Как удалить строки с ними?
Должно получиться:
A B C D
1 24 25 34 200
3 34 19 2 34
Ответы (2 шт):
А зачем так сложно, через numpy, когда можно прямо через pandas отфильтровать по условиям:
df_without_noise = df.loc[(df['A'] <= 250) & (df['B'] <= 50)]
А что касается ошибки в вашем коде - по умолчанию drop считает, что вы передали ему на вход индексы, при этом np.where возвращает абсолютные позиции элементов, а не индексы. Некоторые индексы в датафрейме у вас после предыдущего drop отсутствуют и идут не подряд, поэтому и выходит ошибка. В любом случае, лучше не смешивать библиотеки без нужды и пользоваться встроенными средствами pandas, раз уж вы с ней работаете.
Также можно воспользоваться методом DataFrame.query():
df_without_noise = df.query("A <= 250 and B <= 50")
результат:
In [28]: df_without_noise
Out[28]:
A B C D
1 24 25 34 200
3 34 19 2 34