私はdf.f = df[fs]
を使用することはありません。データフレームを変更しようとすると、望ましくない驚くべき動作につながる可能性があります。代わりに、以下の例のように階層型の列を作成することを検討します。
言って、我々はすでに既存のデータフレームdf0
と機能を備えた別の1持っている:
df = pd.concat([df0, df1], keys=['pre', 'feat1'], axis=1)
df
Out[103]:
pre feat1
A B f0 f1 f2
0 0 1 10 11 12
1 2 3 13 14 15
:concat
にkeys
引数を使用して、その後
df0 = pd.DataFrame(np.arange(4).reshape(2,2), columns=['A', 'B'])
df1 = pd.DataFrame(np.arange(10, 16).reshape(2,3), columns=['f0', 'f1', 'f2'])
を、私たちは列に別のレベルを作成します機能を備えたサブフレームは、以下のようにアクセスすることができる。
df['feat1']
Out[104]:
f0 f1 f2
0 10 11 12
1 13 14 15
df[('feat1', 'f0')]
Out[105]:
0 10
1 13
Name: (feat1, f0), dtype: int64
行をスライスするのは簡単です。列にスライスして、より複雑であってもよい。
df.loc[:, pd.IndexSlice['feat1', :]]
Out[106]:
feat1
f0 f1 f2
0 10 11 12
1 13 14 15
df.loc[:, pd.IndexSlice['feat1', 'f0':'f1']]
Out[107]:
feat1
f0 f1
0 10 11
1 13 14
例えばdf.loc[1:, ('feat1', 'f1')] = -1
ため、.loc
を使用し、データフレームの値を変更します。 (More on hierarchical indexing, slicing etc.)
df
に別のフレームを追加することもできます。
# another set of features
df2 = pd.DataFrame(np.arange(100, 108).reshape(2,4), columns=['f0', 'f1', 'f2', 'f3'])
# create a MultiIndex:
idx = pd.MultiIndex.from_product([['feat2'], df2.columns])
# append
df[idx] = df2
df
Out[117]:
pre feat1 feat2
A B f0 f1 f2 f0 f1 f2 f3
0 0 1 10 11 12 100 101 102 103
1 2 3 13 -1 15 104 105 106 107
素敵なレイアウトを維持するために、それは、idx
がdf.columns
ようなレベルの同じ番号を持つことが重要です。
'df.f = df [fs]'これにより、fという名前の新しい属性が導入されます。これはスライスではなくdfの属性です。 'df.ix [:1、fs]'を試してください – ayhan
しかし、 'fs'はローカルなので、その情報を' df'にバインドしたいと思います。 – Literal
'df.f = df [fs]'は 'fs'カラムを2回繰り返さないでしょうか?また、IMHO、これは索引付けについて奇妙な方法です。 'fs'はすべての_n_サンプルに対して一定であり、再利用することができます。より大きな画像で達成しようとしているのは正確ですか?おそらくアルゴリズムを実装する簡単な方法があります。 – Kartik