我很困惑,因为我无法使用.loc[:,['A', 'B']
同时修改两列,我想这是因为它返回的是副本而不是视图。我在"索引和选择数据"中找不到关于何时返回视图和何时返回副本的明确指南。
我使用的是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']]
赋值没有效果。
经过仔细检查,我确实看到它不是副本,因为在另一个测试中,我确实分配了一个具有不同值的数据帧,并且它们被"保存"在df2
中,但df2
的dtypes
不能通过.loc[:, ['A', 'B']]
分配来"设置"。
.loc[:, ['A', 'B']] =
赋值不改变数据类型而[['A', 'B']] =
改变数据类型有什么原因吗?
实际上只是添加了一个问题和文档注释。
尝试使用
astype()
和loc()
将列的子集转换为指定类型时,会发生上转换。
loc()
试图适应我们分配给当前数据类型的内容,而[]
将覆盖它们,从右侧获取数据类型。
基本上,.loc
会在赋值时尝试强制转换回原始的dtype,而[]
不会。这是预期的行为,但有点微妙。