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])
...そして、メモリ内に巨大な配列コピーができてしまうので、それは私を覗き見します。おそらくもっと良い方法がありますか?
.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]])
その値を直接使用します。
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]])
最初の問題の場合はおそらく次のようになります。名前に基づいて列に簡単にアクセスできます。
>>> 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]])