簡體   English   中英

Polars 讀取文件導致錯誤

[英]Polars Reading Files Causing Errors

通常在讀取凌亂的 csv 文件時,由於列中數據類型的不一致,我最終會看到不同類型的錯誤,例如:

ComputeError: Could not parse `22.4` as dtype Int64 at column 59.
The current offset in the file is 433793 bytes.

當文件/數據還不熟悉時,我可能不知道 59th position 的列的名稱是什么。我正在尋求比我目前正在做的更有效的過程來克服這些問題的建議:

1 - 首先,我讀取文件並將讀取器選項設置為“infer_schema_length=0”(以 pl.Utf8 字符串格式讀取數據)。 另一種選擇是使用“ignore_erros = True”,但據我了解,它將錯誤值轉換為空值,這通常是我不想要的。

2 - 因為我還不知道第 59 列是哪一列,所以我做了一個 for 循環來找出它

for i in enumerate(df.columns):
print(i)

3 - 一旦我計算出引發錯誤的列名,然后我將過濾 dataframe 以找到該特定值以確定它出現在哪一行:

(pl
    .read_csv(file="file_name.csv", infer_schema_length=0)
    .with_row_count()
    .select(
        [
            pl.col("row_nr"),
            pl.col("Error Column Name")
        ])
    .filter(pl.col("Error Column Name") == "22.4")
)

Output:

shape: (1, 2)
┌────────┬───────────────────┐
│ row_nr ┆ Error Column Name │
│ ---    ┆ ---               │
│ u32    ┆ str               │
╞════════╪═══════════════════╡
│ 842    ┆ 22.4              │
└────────┴───────────────────┘

4 - 然后根據文件和大小寫,但我會將文件源中的值調整為“224”或“22”或“23”或修改 DF 並將所有其他列數據類型轉換為所需的值那些。

問題:

  1. 有沒有比我在第 2 步中做的更簡單的方法來訪問 Polars 中的第 n 列?
  2. 是否有更好的方法來克服導致錯誤的值?
  3. 如果我將文件和列讀取為 pl.Utf8 並調整導致錯誤的值,是否有一種方便的方法可以在讀取數據后自動檢測 df 列的最佳數據類型,而不是逐列手動進行?

文檔中可以看出,默認的infer_schema_length是 100。這意味着如果您有一列,其中前 100 個值是安全的整數,那么它將將該列的數據類型分配為 integer。當它到達一個浮點數時,它會出錯而不是比 go 返回並重置數據類型。 具有諷刺意味的是,您采取了錯誤的方向來更改默認值以獲得您想要的結果。

因此,與其執行pl.read_csv(file="file_name.csv", infer_schema_length=0)然后手動轉換值,不如執行pl.read_csv(file="file_name.csv", infer_schema_length=int(1e10)) 如果仍然出現錯誤,則將1e10變大,或者如果它太慢,則將其變小。

這回答了您的 Q2。

Q1:您不需要遍歷所有值,只需執行df.columns[59]即可獲取第 59 列。此外,您可以執行pl.read_csv("file_name.csv", n_rows=1)占用的空間要小得多 memory

Q3:是/否。 這取決於您認為方便的內容以及您打開的文件格式的范圍。 如果你只是想有一個層次結構的 try int,try float,keep utf 那么你可以這樣做:

for i in df.columns:
    try:
        df=df.with_column(pl.col(i).cast(pl.Int64()))
        continue
    except:
        pass
    try:
        df=df.with_column(pl.col(i).cast(pl.Float64()))
        continue
    except:
        pass
    

暫無
暫無

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

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