2016-08-15 71 views
0

說我有一個Ñp矩陣的p尺寸(例如word2vec元件的單個特徵的Ñ個樣本,使得p是大約300的數量級)。我可以編程創建每個列,例如。與features = ['f'+str(i) for i in range(p)]然後附加到現有的數據幀。參考大熊貓數據幀的許多列一次

既然它們代表了一個特徵,那我以後怎麼才能引用所有這些列呢?我可以指定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'列重複兩次?另外,恕我直言,這是不尋常的索引方式。所有_n_樣本的「fs」將保持不變,並且可以重複使用。你究竟想要在更大的圖景上實現什麼?也許有一個更簡單的方法來實現你的算法。 – Kartik

回答

1

我不會用df.f = df[fs]。如果您嘗試修改數據框架,可能會導致意外和令人驚訝的行爲。相反,我會考慮創建分層列,如下例所示。

說,我們已經有了一個已經存在的數據幀df0和另一個特點:

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']) 

然後,使用keys參數concat,我們創建列另一個層面:

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 

具有特徵的子幀可以如下訪問:

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 

要修改的值在數據幀中,使用.loc,例如df.loc[1:, ('feat1', 'f1')] = -1。 (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

+0

正是我尋找的那種東西。謝謝! – Literal