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?
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
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']
Utiliser *
avec liste
data = df[[*lst]]
Cela donnera le résultat souhaité.