Структурный вопрос по методу pandas .drop - PullRequest
1 голос
/ 06 августа 2020
df2=df.drop(df[df['issue']=="prob"].index)
df2.head()

Код ниже работает нормально.

Но почему нужно набирать df [df [ вместо приведенного ниже?

df2=df.drop(df['issue']=="prob"].index)
df2.head()

Я знаю, что приведенное выше не будет работать, в то время как первое работает. Я хотел бы понять, почему или знать, что именно мне следует гуглить.

Также были бы признательны за любые советы по более актуальному заголовку. Спасибо!

1 Ответ

1 голос
/ 13 августа 2020
  • Вариант 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: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...