2016-11-16 9 views
4

в одном из моих сценариев. Я выбираю несколько столбцов блока данных по списку имен столбцов. Следующий код работает:Выбор столбца dataframe pandas по списку

data = df[lst] 

Он отлично работает до тех пор, как все элементы списка включены в dataframe. Если это не так, оно вернет ошибку «...» не в индексе ».

Есть ли возможность по-прежнему выбирать все столбцы, имя столбца которых включено в этот список, даже если не все элементы списка включены в dataframe?

ответ

10

Я думаю, что вам нужно Index.intersection:

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

lst = ['A','R','B'] 

print (df.columns.intersection(lst)) 
Index(['A', 'B'], dtype='object') 

data = df[df.columns.intersection(lst)] 
print (data) 
    A B 
0 1 4 
1 2 5 
2 3 6 

Другое решение с numpy.intersect1d:

data = df[np.intersect1d(df.columns, lst)] 
print (data) 
    A B 
0 1 4 
1 2 5 
2 3 6 
+0

Большое спасибо. Решение работает нормально – csander

1

Немногие другие способы, и список понимание гораздо быстрее

In [1357]: df[df.columns & lst] 
Out[1357]: 
    A B 
0 1 4 
1 2 5 
2 3 6 

In [1358]: df[[c for c in df.columns if c in lst]] 
Out[1358]: 
    A B 
0 1 4 
1 2 5 
2 3 6 

Задержки

In [1360]: %timeit [c for c in df.columns if c in lst] 
100000 loops, best of 3: 2.54 µs per loop 

In [1359]: %timeit df.columns & lst 
1000 loops, best of 3: 231 µs per loop 

In [1362]: %timeit df.columns.intersection(lst) 
1000 loops, best of 3: 236 µs per loop 

In [1363]: %timeit np.intersect1d(df.columns, lst) 
10000 loops, best of 3: 26.6 µs per loop 

Детали

In [1365]: df 
Out[1365]: 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

In [1366]: lst 
Out[1366]: ['A', 'R', 'B'] 
Смежные вопросы