2016-01-18 3 views
0

У меня есть dataframe, который выглядит следующим образом:Удалить из DataFrame если значение существует

import pandas as pd 
df = pd.DataFrame(data=[[1, 'ABC'], [2, 'ABC'], [3, 'ABCDEF'], [1, 'ABCDEF']], columns=['id', 'marker']) 

Я фактически пытаюсь сделать это SQL заявления, но в панде.

delete #table 
from #table a, #table b 
where a.id = b.id 
and a.marker = b.marker + 'DEF' 

Что бы эффективно избавилось от последней строки в кадре данных. Любая идея, как я могу это сделать?

EDIT:

Для уточнения на вышесказанном, позволяет сказать, что данные, как это:

id marker 
0 1  ABC 
1 2  ABC 
2 3 ABCDEF 
3 1 ABCDEF 
4 4 ABCDEF 

Ответ должен быть

id marker 
0 1  ABC 
1 2  ABC 
2 3 ABCDEF 
4 4 ABCDEF 

(1, 'ABCDEF') является опущено, поскольку присутствует (1, «ABC»), что будет эффективно выполнять оператор SQL (т. е. удалить все строки, где идентификаторы равны, а маркер имеет «DEF»). Если для ID X присутствует только «ABCDEF», он сохранит его, но если ID Y имеет как «ABC», так и «ABCDEF», он удалит «ABCDEF».

ответ

0

Это одно из решений, позволяющее получить то, что вам нужно. Я немного изменил структуру данных, добавил [2, 'ABCDEF'], чтобы продемонстрировать, что этот код будет содержать ABC, независимо от того, появится ли или ABC.

df = pd.DataFrame(data=[[1, 'ABCDEF'], [2, 'ABC'], [2, 'ABCDEF'], [3, 'ABCDEF'], [1, 'ABC']], columns=['id', 'marker']) 
df 
id marker 
0 1 ABCDEF 
1 2 ABC 
2 2 ABCDEF 
3 3 ABCDEF 
4 1 ABC 

lst = df.values.tolist() 
list_tuples = [tuple(l) for l in lst] 
newdata = {} 
for key,value in list_tuples: 
    newdata.setdefault(key, []).append(value) 
newdata = {k:sorted(v) if len(v) > 1 else v for k,v in newdata.items()} 
create_dataframe = {k:v[0] for k,v in newdata.items()} 

df2 = pd.DataFrame(list(create_dataframe.items()), columns=['id', 'marker']) 
df2.index = range(len(df2)) 
df2 

id marker 
0 1 ABC 
1 2 ABC 
2 3 ABCDEF 
+0

Спасибо. Я имел в виду, что это не последняя строка. В принципе, я хочу реплицировать то, что сделал бы этот оператор sql, что позволило бы мне выбрать каждую строку, где маркер «ABC» сначала, если «ABC» не существует, я бы взял «ABCDEF» – swmfg

+0

@swmfg Затем в этом case, в текущем примере, который вы опубликовали, вы не удаляете никаких строк, потому что все значения в столбце 'marker' являются либо' ABC', либо 'ABCDEF'? –

+0

@swmfg Я изменил свой ответ на основе вашего комментария. –

Смежные вопросы