2015-02-17 3 views
0

Я пытаюсь удалить несколько строк в таблице на основе столбца изменения.groupby и select in pandas

id subindex change 
A1  1   0 
A1  2   1 
A1  3   12 
A1  4   0 
A1  5   15 
A1  6   1 
A2  1   0 
A2  2   11 
A2  3   1 
A2  4   0 

В подгруппе (идентификатор идентичен) Когда изменение выше 10, я хочу удалить последующие строки. Таким образом, таблица будет выглядеть так:

id subindex change 
A1  1   0 
A1  2   1 
A2  1   0 

То, что я сделал это GroupBy, чтобы определить, где суб-таблицы должны быть сокращены:

df['cut_position']=df[df.change >= 10].groupby('id')['subindex'].transform(lambda x: x.min()) 

, что дает:

id subindex change  cut_position 
A1  1   0   0 
A1  2   1   0 
A1  3   12   3 
A1  4   0   0 
A1  5   15   0 
A1  6   1   0 
A2  1   0   0 
A2  2   11   2 
A2  3   1   0 
A2  4   0   0 

Тогда в GroupBy ('id') должно быть легко сделать, но у меня возникают проблемы с получением этой таблицы:

id subindex change  cut_position 
A1  1   0   0 
A1  2   1   0 
A1  3   12   ToRemove_3 
A1  4   0   ToRemove_0 
A1  5   15   ToRemove_0 
A1  6   1   ToRemove_0 
A2  1   0   0 
A2  2   11   ToRemove_2 
A2  3   1   ToRemove_0 
A2  4   0   ToRemove_0 

При написании кода, который может генерировать таблицу, я получаю:

df.groupby('id')[df['subindex'] >= df['cut_position'].max()].map(lambda x : 'ToRemove_' + x) 

KeyError: «Колонна не найдено: Накладные, True»

Примечания: Я сделал то, что работало, но он принял слишком много времени, чтобы сделать это ...

+0

Изменение 10 означает, что качество данных ослабила с этой точки и ниже. Поэтому я хочу удалить все данные ниже того, у кого было изменение 10 или более. – Sara

+0

Thx Sara. Я удалил свой комментарий после повторного рассмотрения вашего вопроса. –

ответ

1

На 100% не удовлетворены этим подходом, но вы можете попробовать.

Учитывая ваш кадр

id subindex change 
A1  1   0 
A1  2   1 
A1  3   12 
A1  4   0 
A1  5   15 
A1  6   1 
A2  1   0 
A2  2   11 
A2  3   1 
A2  4   0 

Затем создайте рамку с первой строки каждого «ид» Thats больше, чем 10

rowindex = df['change'] > 10 
greaterThan10 = df[rowindex].groupby('id',as_index=False).first() 

Чем слияния() из исходного кадра и greaterThan10

dfKeep = pd.merge(df,greaterThan10,how='left',on=['id'],suffixes=['','_cut']) 

Затем фильтрация новой рамы для «хранителей»

mask = (dfKeep['subindex'] < dfKeep['subindex_cut']) 
dfKeep[mask][['id','subindex','change']] 

дает

id subindex change 
0 A1 1   0 
1 A1 2   1 
6 A2 1   0 
+0

Спасибо, Боб, он делает это, и это довольно быстро. – Sara

+0

Хорошая сделка. Спасибо за ответ –