簡體   English   中英

Pandas:ValueError:無法將浮點 NaN 轉換為整數

[英]Pandas: ValueError: cannot convert float NaN to integer

我得到ValueError: cannot convert float NaN to integer for following:

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
  • “x”顯然是 csv 文件中的一列,但我無法在文件中發現任何浮點 NaN ,也不明白這是什么意思。
  • 當我將列讀取為字符串時,它具有像 -1,0,1,...2000 這樣的值,對我來說,所有的整數看起來都非常好。
  • 當我將列讀取為浮動時,可以加載它。 然后它將值顯示為 -1.0,0.0 等,仍然沒有任何 NaN-s
  • 我嘗試在read_csv 中使用error_bad_lines = False和 dtype 參數無濟於事。 它只是以相同的異常取消加載。
  • 該文件不小(10+ M 行),因此無法手動檢查它,當我提取一個小的標題部分時,沒有錯誤,但它發生在完整文件中。 所以它是文件中的東西,但無法檢測到什么。
  • 從邏輯上講,csv 不應該有缺失值,但即使有一些垃圾,我也可以跳過這些行。 或者至少識別它們,但我看不到掃描文件和報告轉換錯誤的方法。

更新:使用評論/答案中的提示,我用這個清理了我的數據:

# x contained NaN
df = df[~df['x'].isnull()]

# Y contained some other garbage, so null check was not enough
df = df[df['y'].str.isnumeric()]

# final conversion now worked
df[['x']] = df[['x']].astype(int)
df[['y']] = df[['y']].astype(int)

要識別NaN值,請使用boolean indexing

print(df[df['x'].isnull()])

然后刪除所有非數字值使用to_numeric和參數errors='coerce' - 將非數字值替換為NaN s:

df['x'] = pd.to_numeric(df['x'], errors='coerce')

要刪除x列中帶有NaN的所有行,請使用dropna

df = df.dropna(subset=['x'])

最后將值轉換為int s:

df['x'] = df['x'].astype(int)

ValueError:無法將浮點 NaN 轉換為整數

從 v0.24 開始,您實際上可以。 Pandas 引入了Nullable Integer 數據類型,它允許整數與 NaN 共存。

給定一系列缺失數據的整浮點數,

s = pd.Series([1.0, 2.0, np.nan, 4.0])
s

0    1.0
1    2.0
2    NaN
3    4.0
dtype: float64

s.dtype
# dtype('float64')

您可以將其轉換為可為空的 int 類型(從Int16Int32Int64之一中選擇),

s2 = s.astype('Int32') # note the 'I' is uppercase
s2

0      1
1      2
2    NaN
3      4
dtype: Int32

s2.dtype
# Int32Dtype()

您的專欄需要有整數才能進行演員表。 其他任何事情都會引發 TypeError:

s = pd.Series([1.1, 2.0, np.nan, 4.0])

s.astype('Int32')
# TypeError: cannot safely cast non-equivalent float64 to int32

此外,即使在最新版本的熊貓中,如果列是對象類型,您也必須先轉換為浮點數,例如:

df['column_name'].astype(np.float).astype("Int32")

注意:出於某種原因,您必須先通過 numpy float 再到可空 Int32。

int 的大小(如果是 32 或 64)取決於您的變量,請注意,如果您的數字對於格式來說太大,您可能會失去一些精度。

我知道這已得到解答,但希望將來為任何人提供替代解決方案:

您可以使用.loc僅按notnull()值對數據幀進行子集化,然后僅對'x'列進行子集化。 取相同的向量,然后對其apply(int)

如果列 x 是浮動的:

df.loc[df['x'].notnull(), 'x'] = df.loc[df['x'].notnull(), 'x'].apply(int)

如果你有空值那么在做數學運算你會得到這個錯誤來解決它使用df[~df['x'].isnull()]df[['x']].astype(int)如果你想要你的數據集不可更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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