我不會用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
。
'df.f = df [fs]'通過這樣做,您引入了一個名爲f的新屬性,這是df的屬性,而不是它的切片。試試'df.ix [:1,fs]' – ayhan
對,但'fs'是本地的,我想將它的信息綁定到'df'。 – Literal
不是'df.f = df [fs]'導致你的'fs'列重複兩次?另外,恕我直言,這是不尋常的索引方式。所有_n_樣本的「fs」將保持不變,並且可以重複使用。你究竟想要在更大的圖景上實現什麼?也許有一個更簡單的方法來實現你的算法。 – Kartik