[英]applying a (row) function to a DataFrame changes column types
對列類型進行意外更改時遇到問題,蒸餾如下所示。 x 列是浮點數,icol 列是整數。 當應用測試函數(什么都不做)時,列 icol 更改為 float64 類型,如以下代碼所示:
df = pd.DataFrame({'x':[1000, -1000, 1.0]})
df['icol'] = 1
print(df.dtypes)
def testfunction(r):
pass
return(r)
df = df.apply(testfunction, axis='columns')
print(df.dtypes)
但是,如果我將 x 和 icol 列都設為整數,則類型不會改變。
df = pd.DataFrame({'x':[1000, -1000]})
df['icol'] = 1
print(df.dtypes)
def testfunction(r):
pass
return(r)
df = df.apply(testfunction, axis='columns')
print(df.dtypes)
這是一種潛在的危險,例如,如果以后可能會使用 int 列作為鍵,等等。
這是一個功能,還是我在這里做錯了什么? 在 ubuntu 上運行 python 3.7.3
謝謝
所有 Pandas 操作都試圖盡可能提高數值效率。 對一行應用操作時,Pandas 會首先嘗試從該行構造一個Series
。 如果行是整數和浮點數的混合,它們將被轉換為浮點數,就像將混合列表傳遞給Series
構造函數時一樣: Series([1000.0, 1])
被轉換為所有浮點數:即Series([1000.0, 1.0])
因此,如果您的行包含字符串,則使用object
dtype 並以性能為代價保留所有類型。 一般來說,您應該盡可能避免apply
並使用其他 Pandas 方法來獲得結果。
df = pd.DataFrame({'x':[1000, -1000, 1.0]})
df['y'] = 1
df['z'] = 'hello'
print(df.apply(testfunction, axis='columns').dtypes)
# prints:
x float64
y int64
z object
dtype: object
感謝您提供信息豐富的回答和評論。 這是另一個簡單的解決方法,適用於不想因使用 row 函數模式而后悔的其他人:
df = pd.DataFrame({'x':[1000, -1000.1]})
df['icol'] = 1
print(df.dtypes)
def testfunction(r):
pass
return(r)
# save the types
types = df.dtypes
df = df.apply(testfunction, axis='columns')
print(df.dtypes)
# put 'em back
df = df.astype(types.to_dict(), copy=False)
print(df.dtypes)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.