.loc[:, ['A', 'B']] 赋值是否允许更改列的 dtype?



我很困惑,因为我无法使用.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中,但df2dtypes不能通过.loc[:, ['A', 'B']]分配来"设置"。

.loc[:, ['A', 'B']] =赋值不改变数据类型而[['A', 'B']] =改变数据类型有什么原因吗?

实际上只是添加了一个问题和文档注释。

尝试使用astype()loc()将列的子集转换为指定类型时,会发生上转换。

loc()试图适应我们分配给当前数据类型的内容,而[]将覆盖它们,从右侧获取数据类型。

基本上,.loc会在赋值时尝试强制转换回原始的dtype,而[]不会。这是预期的行为,但有点微妙。

最新更新