Je me demande s’il existe un moyen plus simple et économe en mémoire de sélectionner un sous-ensemble de lignes et de colonnes dans un pandas DataFrame.
Par exemple, étant donné ce dataframe:
df = DataFrame (np.random.Rand (4,5), columns = list ('abcde')) print df abcde 0 0,945686 0.000710 0,909158 0,892892 0,326670 1 0,919359 0,667057 0,462478 0,008204 0,473096 [.____] 2 0,97616 3 0
Je veux uniquement les lignes dans lesquelles la valeur de la colonne 'c' est supérieure à 0,5, mais je n'ai besoin que des colonnes 'b' et 'e' pour ces lignes.
C’est la méthode que j’ai mise au point - il existe peut-être une meilleure méthode de "pandas"?
locs = [df.columns.get_loc (_) pour _ dans ['a', 'd']] print df [df.c> 0.5] [locs] ad 0 0.945686 0.892892
Mon objectif final est de convertir le résultat en un tableau numpy pour le passer dans un algorithme de régression Sklearn. Je vais donc utiliser le code ci-dessus comme ceci:
training_set = tableau (df [df.c> 0.5] [locs])
... et ça me pèse parce que je me retrouve avec une énorme copie de tableau en mémoire. Peut-être y a-t-il un meilleur moyen pour cela aussi?
.loc
accepte les sélecteurs de lignes et de colonnes simultanément (comme le fait .ix/.iloc
FYI) Cela se fait également en un seul passage.
In [1]: df = DataFrame(np.random.Rand(4,5), columns = list('abcde'))
In [2]: df
Out[2]:
a b c d e
0 0.669701 0.780497 0.955690 0.451573 0.232194
1 0.952762 0.585579 0.890801 0.643251 0.556220
2 0.900713 0.790938 0.952628 0.505775 0.582365
3 0.994205 0.330560 0.286694 0.125061 0.575153
In [5]: df.loc[df['c']>0.5,['a','d']]
Out[5]:
a d
0 0.669701 0.451573
1 0.952762 0.643251
2 0.900713 0.505775
Et si vous voulez les valeurs (bien que cela devrait passer directement à sklearn tel quel); les cadres supportent l'interface tableau
In [6]: df.loc[df['c']>0.5,['a','d']].values
Out[6]:
array([[ 0.66970138, 0.45157274],
[ 0.95276167, 0.64325143],
[ 0.90071271, 0.50577509]])
Utilisez sa valeur directement:
In [79]: df[df.c > 0.5][['b', 'e']].values
Out[79]:
array([[ 0.98836259, 0.82403141],
[ 0.337358 , 0.02054435],
[ 0.29271728, 0.37813099],
[ 0.70033513, 0.69919695]])
Peut-être que quelque chose comme ceci pour le premier problème, vous pouvez simplement accéder aux colonnes par leurs noms:
>>> df = pd.DataFrame(np.random.Rand(4,5), columns = list('abcde'))
>>> df[df['c']>.5][['b','e']]
b e
1 0.071146 0.132145
2 0.495152 0.420219
Pour le deuxième problème:
>>> df[df['c']>.5][['b','e']].values
array([[ 0.07114556, 0.13214495],
[ 0.49515157, 0.42021946]])