2016-08-15 2 views
0

Pとなるように、私は、例えばP寸法(word2vec要素の単一の特徴のNサンプルのNPマトリックスを有していると言います約300のオーダー)。プログラム的に各列を作成することができます。 features = ['f'+str(i) for i in range(p)]とし、既存のデータフレームに追加します。リファレンス多くの列が一度

これらは1つの機能を表しているので、どのようにこれらの列を後で参照できますか? df.feature = df[features]を割り当てることはできますが、データセットをスライスすると破損します。df[:x].featureの結果は例外です。

例:

df = pre_exisiting_dataframe() # such that len(df) is n 
n,p = 3,4 
m = np.arange(n*p).reshape((n,p)) 
fs = ['f'+str(i) for i in range(p)] 
df_m = pd.DataFrame(m) 
df_m.columns = fs 
df = pd.concat([df,df_m],axis=1) # m is now only a part of df 
df.f = df[fs] 
df.f # works: I can access the whole m at once 
df[:1].f # crashes 
+0

'df.f = df [fs]'これにより、fという名前の新しい属性が導入されます。これはスライスではなくdfの属性です。 'df.ix [:1、fs]'を試してください – ayhan

+0

しかし、 'fs'はローカルなので、その情報を' df'にバインドしたいと思います。 – Literal

+0

'df.f = df [fs]'は 'fs'カラムを2回繰り返さないでしょうか?また、IMHO、これは索引付けについて奇妙な方法です。 'fs'はすべての_n_サンプルに対して一定であり、再利用することができます。より大きな画像で達成しようとしているのは正確ですか?おそらくアルゴリズムを実装する簡単な方法があります。 – Kartik

答えて

1

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

concatkeys引数を使用して、その後

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 

素敵なレイアウトを維持するために、それは、idxdf.columnsようなレベルの同じ番号を持つことが重要です。

+0

私が探していたものとまったく同じです。ありがとう! – Literal

関連する問題