[英]Pandas.read_csv with multiple delimiters for lines and versus columns
[英]make pandas.read_csv to not add lines with less columns delimiters than the main lines
將pandas.read_csv
與on_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.