web-dev-qa-db-fra.com

Sélection de colonne de données par pandas par liste

dans l'un de mes scripts, je sélectionne plusieurs colonnes d'un cadre de données, en sélectionnant une liste de noms de colonnes. Le code suivant fonctionne:

data = df[lst]

Cela fonctionne bien tant que tous les éléments de la liste sont inclus dans le cadre de données. Si ce n'est pas le cas, l'erreur "" .... 'pas dans l'index "sera renvoyée.

Est-il possible de toujours sélectionner toutes les colonnes dont le nom de colonne est inclus dans cette liste, même si tous les éléments de la liste ne sont pas inclus dans le cadre de données? 

6
csander

Je pense que vous avez besoin de 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

Une autre solution avec numpy.intersect1d :

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

Peu d'autres moyens, et la compréhension de la liste est beaucoup plus rapide

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

Les horaires

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

Détails

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']
2
Zero

Utiliser * avec liste

data = df[[*lst]]

Cela donnera le résultat souhaité. 

0
Avinash