2017-10-08 42 views
2

如何將pandas.to_numeric應用於使用.loc[]選擇的DataFrame子集?例如。考慮這個數據框:將pandas.to_numeric應用於使用pandas中loc的列的選定子集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()試圖適應我們正在分配給當前的dtype,而[]將從右側覆蓋它們。

因此,類型應改變使用[] jezrael的答案建議。更多信息在documentation

回答

3

它看起來像蟲子。

爲我工作:

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

謝謝!這工作。 –

+1

我報告了可能的錯誤:https://github.com/pandas-dev/pandas/issues/17818 –

+0

超級,這是個好主意。我真的很好奇,如果它是錯誤的,也是如果將在下一個版本的熊貓修復。 – jezrael

相關問題