2016-11-29 38 views
3

我想從float更新列到int。在以下兩種情況下考慮df爲什麼要用loc和和slice分配數據幀與使用單個列不同?

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 

enter image description here

的D型細胞無法更新到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 

enter image description here

的作品就好了。

這些行爲有不同的理由嗎?

+0

有趣的發現。它似乎工作,只要你的loc選擇不涉及列的[[]]。也就是說,'df.loc [:,'A'] = df [['A']]。astype(int)'像'df.loc [:,'A'] = df.A.astype(int )'。 –

+0

雖然這並不構成可靠的理由,但這些差異可能與以下事實有關:在第一種情況下,您正在更改「DataFrame」的數據類型,而在第二種情況下,您正在更改數據類型'Series'。 – Abdou

+0

如果使用「df [['A']] = df [['A']]。astype(int)」,它將返回A,類型爲int64 ...我想這與loc和[]有關函數詳細的方式,也許還要求在https://github.com/pandas-dev/pandas/issues會得到更好的結果 – linpingta

回答

1

從一documentation

注意當嘗試使用astype()和LOC(以列的子集轉換爲指定類型 ),出現向上轉型。 loc()嘗試適合我們分配給當前dtypes的 ,而[]將覆蓋它們從 中取出右邊的dtype。因此以下 段代碼會產生意想不到的結果。

相關問題