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

ece*_*ulm 5 pandas

我感到困惑,因为我无法一次修改两列.loc[:,['A', 'B'],我猜是因为它返回的是副本而不是视图.我在索引和选择数据中找不到关于何时返回视图以及何时返回副本的权威指南.

我使用的是熊猫0.18,我可以看到,在旧版本的文件(大熊猫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
Run Code Online (Sandbox Code Playgroud)

没有人提出SettingWithCopy警告.所以我对为什么有点困惑,这项df2.loc[:, ['A', 'B']]任务没有任何效果.

仔细观察后我看到,它不是一个副本,因为在另一项测试,我做了分配不同值的数据帧和我他们"拯救"中df2,但该dtypesdf2不能被"套"通过.loc[:, ['A', 'B']]分配.

有没有理由为什么.loc[:, ['A', 'B']] =赋值不会改变dtypes [['A', 'B']] =呢?

chr*_*isb 6

实际上只是一个问题,并且添加了关于此的文档注释。

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

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

基本上,.loc尝试在分配时转换回原始数据类型,但[]不会。这是预期的行为,但有点微妙。