您可以使用X['var2'].iloc[[0,1]]:In [280]: X['var2'].iloc[[0,1]]
Out[280]:
0 NaN
4 9
Name: var2, dtype: float64
由于X['var2']是X的視圖,因此X['var2'].iloc[[0,1]]對兩者都是安全的
訪問和分配。但是如果你使用這種“鏈式索引”要小心
模式(例如這里使用的index by column then index by-iloc模式)進行賦值,因為它不是
推廣到多列賦值的情況。在
例如,X[['var2', 'var3']].iloc[[0,1]] = ...生成
X的子數據幀,因此對該子數據幀的賦值不會修改X。
有關詳細說明,請參閱"Why assignments using chained indexing
fails"上的文檔。在
具體來說,為了說明此視圖與副本區別的重要性,請執行以下操作:
^{pr2}$
然后,此賦值將引發SettingWithCopyWarning警告:In [252]: X[['var2', 'var3']].iloc[[0,1]] = 100
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a
DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
賦值無法修改X。哎呀!在In [281]: X
Out[281]:
var1 var2 var3
0 3 NaN 11
4 3 9 13
3 2 NaN 14
2 5 9 12
1 2 7 13
要解決這個問題,當您希望一個賦值影響X時,必須
分配給一個單索引器(例如X.iloc = ...或{}或X.ix = ...),也就是說,沒有鏈式索引。在
在這種情況下,您可以使用In [265]: X.iloc[[0,1], X.columns.get_indexer_for(['var2', 'var3'])] = 100
In [266]: X
Out[266]:
var1 var2 var3
0 3 100 100
4 3 100 100
3 2 NaN 14
2 5 9 12
1 2 7 13
但我想知道有沒有更好的方法,因為這不是非常漂亮。在