Я розширюю загальне рішення @ Користувача, щоб запропонувати drop
безкоштовну альтернативу. Це для людей, спрямованих тут на основі назви питання (не проблема ОП)
Скажімо, ви хочете видалити всі рядки з негативними значеннями. Одне рішення вкладиша:
df = df[(df > 0).all(axis=1)]
Покрокове пояснення: -
Давайте генеруємо 5x5 випадкових нормальних кадрів даних розподілу
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
1 -0.977278 0.950088 -0.151357 -0.103219 0.410599
2 0.144044 1.454274 0.761038 0.121675 0.443863
3 0.333674 1.494079 -0.205158 0.313068 -0.854096
4 -2.552990 0.653619 0.864436 -0.742165 2.269755
Нехай умова видаляє негативи. Булева df, що задовольняє умові: -
df > 0
A B C D E
0 True True True True True
1 False True False False True
2 True True True True True
3 True True False True False
4 False True True False True
Логічний ряд для всіх рядків, що задовольняють умові. Примітка, якщо будь-який елемент у рядку не відповідає умові, рядок позначено помилковим
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Нарешті відфільтруйте рядки з кадру даних залежно від умови
df[(df > 0).all(axis=1)]
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
2 0.144044 1.454274 0.761038 0.121675 0.443863
Ви можете призначити його назад до df для фактичного видалення та фільтрації, зробленого вище
df = df[(df > 0).all(axis=1)]
Це можна легко розширити, щоб відфільтрувати рядки, що містять NaN s (не числові записи): -
df = df[(~df.isnull()).all(axis=1)]
Це також може бути спрощено для таких випадків, як: Видалити всі рядки, де стовпець E від'ємний
df = df[(df.E>0)]
Я хотів би закінчити кілька статистичних даних про те, чому рішення @ користувача drop
повільніше, ніж фільтрація на основі необроблених стовпців: -
%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Стовпчик в основному є масивом, Series
тобто NumPy
його можна індексувати без будь-яких витрат. Для людей , зацікавлених в тому , як лежить в основі організація пам'ять грає в швидкість виконання тут є відмінною Посилання на Форсування панди :
df[[(len(x) < 2) for x in df['column name']]]
але ваш набагато приємніший. Спасибі за вашу допомогу!