【发布时间】: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