【问题标题】:Does .loc[:, ['A','B']] assignment allow to change the dtype of the columns?.loc[:, ['A','B']] 分配是否允许更改列的 dtype?
【发布时间】:2017-03-07 22:45:40
【问题描述】:

我很困惑,因为我无法使用.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']] 分配没有效果。

经过仔细检查,我确实看到 它不是副本,因为在另一次测试中,我确实分配了具有不同值的数据框,我将它们“保存”在 df2 但 @987654327 df2 中的 @ 不能通过 .loc[:, ['A', 'B']] 分配“设置”。

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

【问题讨论】:

  • 这看起来像一个错误,在0.18.1 中的行为是相同的,并且dtypes 没有正确设置,如果你查看df2['A'].iloc[0] 你会发现它确实是@987654335 @ dtype 和所有元素一样 df2['A'].apply(lambda x: print(type(x))) 这可能是因为我们正在使用新的索引器,它处于某种位置,它可能不确定是否所有行都被修改,因此它保留了原始 dtype 但这是一个猜测
  • for c in ['A', 'B']: df2.loc[:, c] = df2.loc[:, c].astype(float) 也可以工作,但会一一分配pd.Series,而不是全部分配DataFrame

标签: pandas


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多