簡體   English   中英

使 pandas.read_csv 不添加列分隔符少於主行的行

[英]make pandas.read_csv to not add lines with less columns delimiters than the main lines

pandas.read_csvon_bad_lines='warn'選項一起用於具有太多列分隔符的行,它運行良好,不加載壞行並且 stderr 捕獲壞行號:

    import pandas as pd
    from io import StringIO
    data = StringIO("""
    nom,f,nb
    bat,F,52
    cat,M,66,
    caw,F,15
    dog,M,66,,
    fly,F,61
    ant,F,21""")
    df = pd.read_csv(data, sep=',', on_bad_lines='warn')

    # b'Skipping line 4: expected 3 fields, saw 4\nSkipping line 6: expected 3 fields, saw 5\n'

    df.head(10)
    #    nom  f  nb
    # 0  bat  F  52
    # 1  caw  F  15
    # 2  fly  F  61
    # 3  ant  F  21

但如果分隔符的數量(此處為sep=, )小於主分隔符,則添加該行並添加NaN 。:

    import pandas as pd
    from io import StringIO
    data = StringIO("""
    nom,f,nb
    bat,F,52
    catM66,
    caw,F,15
    dog,M66
    fly,F,61
    ant,F,21""")
    df = pd.read_csv(data, sep=',', on_bad_lines='warn', dtype=str)
    df.head(10)

    #       nom    f   nb
    # 0     bat    F   52
    # 1  catM66  NaN  NaN            <==
    # 2     caw    F   15
    # 3     dog  M66  NaN            <==
    # 4     fly    F   61
    # 5     ant    F   21

有沒有辦法讓read_csv不添加列分隔符少於主行的行?

注意:我正在加載真正的大數據文件(例如數億行,所以這個想法不是提出任何前期 grep/sed/awk 處理,而是利用快速read_csv bulk_load)

pd.read_csv()是一個非常好的 function ,它執行定義明確的計算,但您需要稍微不同的計算。 您希望過濾掉包含少於 K 個字段的所有行。

這個想法是不提出任何前期 grep / sed / awk 處理

您相當限制了解決方案的空間。 顯然,速度(經過的時間)或功率效率(耗散的瓦數)是令人擔憂的問題。

您正確地觀察到grep非常快,並且將是一個自然的預處理階段。 可以將其過濾后的 output 存儲到我們提供給.read_csv() 的臨時文件中,這可能會花費額外的磁盤 I/O。 更好的解決方案是使用子進程庫pipe 其 output 。

原始帖子沒有提到grep時序結果,因此尚不清楚由於額外的子進程導致的開銷是否已被證明“太慢”。 沒有 N 行/秒的吞吐量規范,因此不清楚應該如何評估這個或任何競爭提案。

請注意, .read_csv()接受類似文件的 object,它可能是一個 python 生成器,它檢查每一行並只yield s 合適的行。

鑒於您對 call.read_csv() 很感興趣,這是一個 function 並不能完全計算出您想要的東西,似乎沒有什么可以做的,但要對其 output 進行后處理並希望最好。

過濾掉所有NaN可能會做,但這有點過激。 有一些錯誤的生成過程會產生少於 K 個字段的“短”行。 如果您知道它保證產生的最小字段數,您至少可以進行適當的按列過濾以丟棄短行。 然后你可以在前幾列中保留真正的NaN 祝你好運!

暫無
暫無

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

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