¿Cómo eliminar todas las columnas en DataFrame excepto algunas?

Digamos que tengo un DataFrame que se ve así:

abcdefg 1 2 3 4 5 6 7 4 3 7 1 6 9 4 8 9 0 2 4 2 1 

¿Cómo voy a eliminar cada columna además de a y b ?

Esto resultaría en:

 ab 1 2 4 3 8 9 

Me gustaría una forma de eliminarlos usando una línea simple de código que diga, elimine todas las columnas, además de a y b , porque digamos hipotéticamente que tengo 1000 columnas de datos.

Gracias.

 In [48]: df.drop(df.columns.difference(['a','b']), 1, inplace=True) Out[48]: ab 0 1 2 1 4 3 2 8 9 

o:

 In [55]: df = df.loc[:, df.columns.intersection(['a','b'])] In [56]: df Out[56]: ab 0 1 2 1 4 3 2 8 9 

PD, tenga en cuenta que la forma más idiomática de Pandas para hacerlo ya fue propuesta por @Wen :

 df = df[['a','b']] 

o

 df = df.loc[:, ['a','b']] 

hay multiples solucion

 df=df[['a','b']]#1 df=df[list('ab')]#2 df=df.loc[:,df.columns.isin(['a','b'])]#3 df=pd.DataFrame(data=df.eval('a,b').T,columns=['a','b'])#4 PS:I do not recommend this method , but still a way to achieve this 

Otra opción para agregar a la mezcla. Prefiero este enfoque para la legibilidad.

 df = df.filter(['a', 'b']) 

o simplemente

 df.filter(['a', 'b']) 

Prima

También puedes usar un argumento like o regex para filtrar.
Útil si tiene un conjunto de columnas como ['a_1','a_2','b_1','b_2']

Podrías hacerlo

 df.filter(like='b_') 

y termina con ['b_1','b_2']

Documentación de pandas para el filtro.

Si solo desea mantener más columnas de las que está colocando, coloque un “~” antes de la statement .isin para seleccionar todas las columnas, excepto las que desea:

 df = df.loc[:, ~df.columns.isin(['a','b'])]