Python 为什么使用loc和一个slice分配给数据帧与使用单个列不同?
我尝试从浮点到int更新列。在下面两个场景中考虑<代码> df>代码>:< /p>Python 为什么使用loc和一个slice分配给数据帧与使用单个列不同?,python,pandas,Python,Pandas,我尝试从浮点到int更新列。在下面两个场景中考虑 df>代码>:< /p> df = pd.DataFrame(dict(A=[1.1, 2], B=[1., 2])) print(df.A.dtype) df.loc[:, ['A']] = df[['A']].astype(int) print(df.A.dtype) df 数据类型未能更新为int,但'A'中的值肯定被截断 但是, df = pd.DataFrame(dict(A=[1.1, 2], B=[1., 2])) prin
df = pd.DataFrame(dict(A=[1.1, 2], B=[1., 2]))
print(df.A.dtype)
df.loc[:, ['A']] = df[['A']].astype(int)
print(df.A.dtype)
df
数据类型未能更新为int
,但'A'
中的值肯定被截断
但是,
df = pd.DataFrame(dict(A=[1.1, 2], B=[1., 2]))
print(df.A.dtype)
df.loc[:, 'A'] = df.A.astype(int)
print(df.A.dtype)
df
很好用
这些行为有不同的理由吗?右起:
尝试将列的子集转换为指定类型时请注意
使用astype()和loc(),将发生向上转换。loc()试图适应什么
我们正在分配给当前的数据类型,而[]将覆盖它们
从右侧获取数据类型。因此,以下
这段代码产生了意外的结果
有趣的发现。只要您的
loc
选择不涉及[]
列,它似乎就可以工作。也就是说,df.loc[:,'A']=df[['A']].astype(int)
的工作原理类似于df.loc[:,'A']=df.A.astype(int)
。虽然这并不构成可靠的理由,但这些差异可能与以下事实有关:在第一种情况下,您正在更改数据帧的数据类型,而在第二种情况下,您正在更改系列的数据类型。如果使用“df[['a']]=df[['a']].astype(int)”,它将返回类型为int64的数据类型。。。我猜它与loc和[]函数有着详细的关系,可能也会有更好的结果,因为pandas在从数据帧赋值时将int
升级为float
。。。这可能是因为系列
!=DataFrame
。我敢说这是因为df.loc[:,'A']
是一个系列
,但是df.loc[:,['A']]
是一个带有一列的DataFrame
。