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

时间:2016-06-03 16:26:38

标签: pandas

我感到困惑,因为我无法使用.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;在df2dtypes的{​​{1}}不能"设置"通过df2作业。

.loc[:, ['A', 'B']]分配没有改变dtypes和.loc[:, ['A', 'B']] =的原因有什么原因吗?

1 个答案:

答案 0 :(得分:4)

实际上只添加了issuedoc note。基本上,.loc会尝试在分配时转回原始dtype,而[]则不会。这是预期的行为,但有点微妙。