我感到困惑,因为我无法使用.loc[:,['A', 'B']
一次修改两列,我猜是因为它返回的是副本而不是视图。我在Indexing and Selecting Data中找不到关于何时返回视图以及何时返回副本的权威指南。
我使用pandas 0.18,我可以看到在旧版本的文档(pandas 0.13)中曾经说过"每当索引操作中涉及标签数组或布尔向量时,结果将是一个副本"但我在当前的文档中找不到
pd.__version__
# u'0.18.0'
df = pd.DataFrame({'A': ['1', '2', '3', '4',
'5', '6', '7', '8'],
'B': ['1', '2', '3', '4',
'5', '6', '7', '8'],
'C': ['1', '2', '3', '4',
'5', '6', '7', '8']})
df.dtypes
#A object
#B object
#C object
#dtype: object
df2 = df.copy()
df2[['A', 'B']] = df2.loc[:,['A' , 'B']].astype(float) # Works
df2.dtypes
#A float64
#B float64
#C object
#dtype: object
df2 = df.copy()
df2.loc[:,['A', 'B']] = df2.loc[:,['A' , 'B']].astype(float) # Does NOT work
df2.dtypes
#A object
#B object
#C object
#dtype: object
没有人提出SettingWithCopy
警告。所以我对为什么有点困惑,df2.loc[:, ['A', 'B']]
赋值没有效果。
仔细观察后,我确实看到它不是副本,因为在另一个测试中,我确实分配了一个具有不同值的数据帧,而我们已经"保存了#34;在df2
但dtypes
的{{1}}不能"设置"通过df2
作业。
.loc[:, ['A', 'B']]
分配没有改变dtypes和.loc[:, ['A', 'B']] =
的原因有什么原因吗?