2015-02-10 4 views
1

У меня есть следующий кадр данных:Выбор строк - на основе списка - из DF с дублированных столбцов

import pandas as pd 
rep = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z']), ('Gene', ['foo', 'bar', 'qux']), ('Probe',['x','y','z']), ("RP",[1.00,2.33,4.5])], orient='columns') 

Который производит:

In [11]: rep 
Out[11]: 
    Probe Gene Probe RP 
0  x foo  x 1.00 
1  y bar  y 2.33 
2  z qux  z 4.50 

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

ls = ["x", "z", "i"] 

Уступая это:

Probe Gene Probe RP 
0  x foo  x 1.00 
2  z qux  z 4.50 

Обратите внимание, что мы хотели бы сохранить столбцы, основанные на оригинальном DF выше.

Почему это не удалось?

In [9]: rep[rep[[0]].isin(ls)] 
ValueError: cannot reindex from a duplicate axis 

Каков правильный путь? Любая альтернатива isin?

ответ

1

Вы должны использовать iloc здесь:

In [11]: rep.iloc[rep.iloc[0].isin(ls).values] 
Out[11]: 
    Probe Gene Probe RP 
0  x foo  x 1.0 
2  z qux  z 4.5 

Это первый создает булево вектор (как одномерный массив, а не DataFrame), и вы можете использовать это в качестве маски:

In [12]: rep.iloc[0].isin(ls).values 
Out[12]: array([ True, False, True, False], dtype=bool) 
1

Возможно, вам стоит упомянуть, содержит ли этот список ls значения, принадлежащие фиксированному столбцу, скажем, Probe. Если это так, то работает следующее.

rep.ix[rep.Probe.isin(ls).ix[:,1]] 
Смежные вопросы