Удаление строк из фрейма данных на основе условия или значения

#python #python-3.x #pandas #dataframe #group-by

#python #python-3.x #pandas #фрейм данных #группировать по

Вопрос:

Есть ли способ удалить данные из df, которые были сгруппированы и отсортированы на основе значений столбцов?

     id               time_stamp          df  rank
   002         2019-02-23 20:01:13.362  mdf   0
   002         2019-02-23 20:02:06.939  tof   1
   004         2019-03-01 02:30:33.332  mdf   0
   004         2019-03-01 02:34:21.134  tof   1
  

данные были сгруппированы по столбцу id и отсортированы по возрастанию метки времени.
Я хочу удалить все строки или идентификаторы, которые не имеют mdf в качестве значения для ранга 0, но не только эту строку, но и все другие строки, которые отличаются от этого идентификатора.

Например, если 004 не был mdf для ранга 0, я хочу удалить все 004, если это имеет смысл.

Спасибо, что посмотрели!

Комментарии:

1. Крис, ты утверждаешь, что у группы 004 нет mdf и 0 ранга. Но здесь это отображается в строке 3 ваших макетных данных. Пожалуйста, уточните формулировку вашей проблемы или измените данные.

2. Я имел в виду, например, если бы это существовало, я бы хотел удалить его, спасибо!

Ответ №1:

Вы могли бы использовать логическую маскировку:

 mask = df['df'].ne('mdf') amp; df['rank'].eq(0)
excl_id = df.loc[mask, 'id'].unique()

df[~df['id'].isin(excl_id)]
  

Ответ №2:

Вот мое решение:

     data="""
id,time_stamp,df,rank
002,2019-02-23 20:01:13.362,mdf,0
002,2019-02-23 20:02:06.939,tof,1
004,2019-03-01 02:30:33.332,mdf,0
004,2019-03-01 02:34:21.134,tof,1
005,2019-03-01 02:35:21.134,mdf,1
005,2019-03-01 02:35:24.134,tof,1
   """
df = pd.read_csv(pd.compat.StringIO(data), sep=',')
print(df)

def process(x):   # the id 005 have to be deleted
    f = x[(x['df']=='mdf')amp; (x['rank'] == 0)]
    return not f.empty

df = df.groupby('id').filter(lambda x: process(x)).reset_index(drop=True)
print(df)
  

вывод:

    id               time_stamp   df  rank
0   2  2019-02-23 20:01:13.362  mdf     0
1   2  2019-02-23 20:02:06.939  tof     1
2   4  2019-03-01 02:30:33.332  mdf     0
3   4  2019-03-01 02:34:21.134  tof     1