簡體   English   中英

將(行)函數應用於 DataFrame 會更改列類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM