Pandas .loc[:,[';A';,';B';]]赋值是否允许更改列的数据类型?

Pandas .loc[:,[';A';,';B';]]赋值是否允许更改列的数据类型?,pandas,Pandas,我很困惑,因为我无法使用.loc[:,['A','B']一次修改两列,我猜这是因为它返回的是一个副本而不是一个视图。我在权威指南中找不到它何时返回视图以及何时返回副本 我使用的是pandas 0.18,我可以看到在较旧版本的文档(pandas 0.13)中,它曾说“每当索引操作涉及标签数组或布尔向量时,结果将是一个副本”,但我在当前文档中找不到这一点 pd.__version__ # u'0.18.0' df = pd.DataFrame({'A': ['1', '2', '3', '4',

我很困惑,因为我无法使用
.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
没有人会用copy发出
设置警告。所以我有点困惑为什么
df2.loc[:,['a','B']]
赋值没有效果

仔细检查后,我确实发现它不是一个副本,因为在另一个测试中,我确实分配了一个具有不同值的数据帧,并且它们被“保存”在
df2
中,但是
df2
dtypes
不能通过
.loc[:,['a',B']
分配进行“设置”


有没有什么原因使得
.loc[:,['A','B']=
作业没有改变数据类型,而
['A','B']=
改变了数据类型?

实际上只有一个,并添加了这一点。基本上,
.loc
试图在作业时回溯到原始的数据类型,即
[]
没有。这是预期的行为,但有点微妙。

这看起来像一个bug,在
0.18.1
中的行为是相同的,
dtype
没有被正确设置,如果你查看
df2['a'].iloc[0]
你会发现它确实是
float
dtype,所有元素都是
df2['a'](lambda x:print(type(x))
这可能是因为我们正在使用新的索引器,它采取了某种位置,可能无法确定是否所有行都被修改,因此它保留了原始的数据类型,但这也是对[a',B']中的c的猜测:df2.loc[:,c]=df2.loc[:,c]=df2.loc[:,c].astype(float)
可以工作,但这会逐个分配
pd.Series
而不是全部完整的
DataFrame