- Вариант 1:
df[df['issue']=="prob"]
производит DataFrame
с подмножеством значений . - Вариант 2:
df['issue']=="prob"
производит pandas.Series
с логическим для каждой строки . .drop
работает для варианта 1, потому что знает, что нужно просто отбросить выбранные индексы, а не все индексы, возвращенные из варианта 2. - Я бы использовал следующие методы для удаления строк.
- Используйте
~
(not), чтобы выбрать противоположность логическому выбору. df = df[~(df.treatment == 'Yes')]
- Выбрать строки только с желаемым значением
df = df[(df.treatment == 'No')]
import pandas as pd
import numpy as np
import random
# sample dataframe
np.random.seed(365)
random.seed(365)
rows = 25
data = {'a': np.random.randint(10, size=(rows)),
'groups': [random.choice(['1-5', '6-25', '26-100', '100-500', '500-1000', '>1000']) for _ in range(rows)],
'treatment': [random.choice(['Yes', 'No']) for _ in range(rows)],
'date': pd.bdate_range(datetime.today(), freq='d', periods=rows).tolist()}
df = pd.DataFrame(data)
df[df.treatment == 'Yes'].index
- Производит только индексы, где
treatment
равно 'Yes'
, поэтому df.drop(df[df.treatment == 'Yes'].index)
отбрасывает только индексы в списке.
df[df.treatment == 'Yes'].index
[out]:
Int64Index([0, 1, 2, 4, 6, 7, 8, 11, 12, 13, 14, 15, 19, 21], dtype='int64')
df.drop(df[df.treatment == 'Yes'].index)
[out]:
a groups treatment date
3 5 6-25 No 2020-08-15
5 2 500-1000 No 2020-08-17
9 0 500-1000 No 2020-08-21
10 3 100-500 No 2020-08-22
16 8 1-5 No 2020-08-28
17 4 1-5 No 2020-08-29
18 3 1-5 No 2020-08-30
20 6 500-1000 No 2020-09-01
22 6 6-25 No 2020-09-03
23 8 100-500 No 2020-09-04
24 9 26-100 No 2020-09-05
(df.treatment == 'Yes').index
- Производит все индексы, поэтому
df.drop((df.treatment == 'Yes').index)
отбрасывает все индексы, оставляя пустой фрейм данных.
(df.treatment == 'Yes').index
[out]:
RangeIndex(start=0, stop=25, step=1)
df.drop((df.treatment == 'Yes').index)
[out]:
Empty DataFrame
Columns: [a, groups, treatment, date]
Index: []