如何将pandas.to_numeric
应用于使用.loc[]
选择的DataFrame子集?例如。考虑这个DataFrame:
df = pd.DataFrame(index=pd.Index([1, 2, 3]))
df['X'] = ['a', 'a', 'b']
df['Y'] = [1, 2, 3]
df['Z'] = [4, 5, 6]
df['Y'] = df['Y'].astype(object)
df['Z'] = df['Z'].astype(object)
df
X Y Z
1 a 1 4
2 a 2 5
3 b 3 6
请注意,Y和Z列的类型为object
。
我想在列Y和Z上应用pandas.to_numeric
将数据类型更改为int
。我测试了3种方法:
df.loc[:, 'Y'] = df.loc[:, 'Y'].apply(pd.to_numeric) # (1) WORKS
df.loc[:, 'Z'] = df.loc[:, 'Z'].apply(pd.to_numeric) # (1) WORKS
df.loc[:, ['Y', 'Z']] = df.loc[:, ['Y', 'Z']].apply(pd.to_numeric) # (2) DOESN'T WORK
df.loc[:, 'Y':'Z'] = df.loc[:, 'Y':'Z'].apply(pd.to_numeric) # (3) DOESN'T WORK
方法(3)和(4)不适用于pd.to_numeric
,但可以使用其他功能,例如
df.loc[:, 'Y':'Z'] = df.loc[:, 'Y':'Z'].apply(lambda x: x*0)
正确地将Y和Z列设置为零。有人可以解释为什么它不适用于pandas.to_numeric
?
修改
最后,事实证明此行为是有意的,因为.loc[:, ...]
和[]
之间存在差异。根据文件:
注意:尝试使用
astype()
和loc()
将列的子集转换为指定的类型时,会发生向上转换。loc()
尝试适应我们分配给当前dtypes的内容,而[]
将覆盖从右侧获取dtype的内容。
因此,应根据jezrael的回答使用[]
更改类型。 documentation。
答案 0 :(得分:3)
好像是错误。
对我来说工作:
df[['Y', 'Z']] = df[['Y', 'Z']].apply(pd.to_numeric)
print (df.dtypes)
X object
Y int64
Z int64
dtype: object