web-dev-qa-db-ja.com

列と行のpandas DataFrameサブセットをnumpy配列に変換する方法は?

pandas 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.976163 0.621712 0.208423 0.980471 0.048334 
 3 0.459039 0.788318 0.309892 0.100539 0.753992 

列 'c'の値が0.5より大きい行のみが必要ですが、これらの行には列 'b'および 'e'のみが必要です。

これは私が思いついた方法です-おそらくより良い「パンダ」の方法がありますか?

 locs = [df.columns.get_loc(_)in _ ['a'、 'd']] 
 print df [df.c> 0.5] [locs] 
 
 ad 
 0 0.945686 0.892892 

私の最終目標は、結果をnumpy配列に変換してsklearn回帰アルゴリズムに渡すことです。したがって、上記のコードを次のように使用します。

 training_set = array(df [df.c> 0.5] [locs])

...そして、メモリ内に巨大な配列コピーができてしまうので、それは私を覗き見します。おそらくもっと良い方法がありますか?

42
John Prior

.locは行セレクターと列セレクターを同時に受け入れます(.ix/.iloc FYIと同様)これは単一パスでも行われます。

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

また、値が必要な場合(ただし、これはそのままsklearnに直接渡す必要があります)。フレームは配列インターフェースをサポートします

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

その値を直接使用します。

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

最初の問題の場合はおそらく次のようになります。名前に基づいて列に簡単にアクセスできます。

>>> 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

2番目の問題の場合:

>>> df[df['c']>.5][['b','e']].values
array([[ 0.07114556,  0.13214495],
       [ 0.49515157,  0.42021946]])
16
Daniel