Панды фильтруют строки по условию, но всегда сохраняют первую строку - PullRequest
3 голосов
/ 28 марта 2019

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

Я попытался удалить строки с помощью функции df.drop, но она удалит первую строку, если первая строка удовлетворяет этому условию. Я этого не хочу.

Данные выглядят примерно так:

Column1 Column2 Column3
  1        3      A
  2        1      B
  3        3      C
  4        1      D
  5        1      E
  6        3      F

Я хочу сделать это таким образом, чтобы, если строка имеет значение 3 в столбце 2, отбросить ее.

И я хочу, чтобы новые данные были такими (после удаления, но с сохранением первой, хотя в первой строке в столбце 2 было значение 3):

Column1 Column2 Column3
  1        3      A
  2        1      B
  4        1      D
  5        1      E

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Я использую duplicated

df[(~df.Column2.duplicated())|df.Column2.ne(3)]
   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E
2 голосов
/ 28 марта 2019

Здесь уже опубликованы отличные ответы, но только для вашего удобства. Мы также можем использовать cumcount для ранжирования Nth 3, находим:

df = df[~((df.groupby('Column2').Column2.cumcount() != 0) & (df.Column2 == 3))]

print(df)
   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E
2 голосов
/ 28 марта 2019

Вы можете сделать «сохранить первый ряд» частью вашего условия для удаления / сохранения строк.

Условие для хранения строк будет <ORIGINAL CONDITION> or <CONDITION TO KEEP FIRST ROW>.В коде это

# (condition to drop 3) | (condition to keep 0th row)
df[(df['Column2'] != 3) | (df.index == 0)]

   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E

И наоборот, при использовании законов Деморгана условие удаления строк будет (df['Column2'] == 3) & (df.index != 0).Затем мы инвертируем условие, чтобы получить ожидаемый результат:

df[~((df['Column2'] == 3) & (df.index != 0))]

   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E

. Эта работа предполагает, что ваш индекс равен RangeIndex.Если нет, используйте pd.RangeIndex(len(df)) == 0 вместо второго условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...