使用pandas DataFrame中的loc将pandas.to_numeric应用于选定的列子集

时间:2017-10-08 09:20:25

标签: python pandas

如何将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

中的更多信息

1 个答案:

答案 0 :(得分:3)

好像是错误。

对我来说工作:

df[['Y', 'Z']] = df[['Y', 'Z']].apply(pd.to_numeric)
print (df.dtypes)
X    object
Y     int64
Z     int64
dtype: object