web-dev-qa-db-fra.com

Comment convertir un sous-ensemble de colonnes ET de lignes ETF dans un tableau numpy pandas

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?

42
John Prior

.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]])
9
Jeff

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]])
70
waitingkuo

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]])
16
Daniel