您可以使用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
但我想知道有没有更好的方法,因为这不是非常漂亮。在