簡體   English   中英

將 CSV 中的行數與 Pandas 成功處理為數據幀的行數進行比較?

[英]Comparing number of lines in a CSV compared to number successfully processed into dataframe by Pandas?

我們正在使用 Pandas 將 CSV 讀入數據幀:

 someDataframe = pandas.read_csv(
        filepath_or_buffer=our_filepath_here,
        error_bad_lines=False,
        warn_bad_lines=True
    )

由於我們允許跳過壞行,因此我們希望能夠跟蹤已跳過的行數並將其放入一個值中,以便我們可以對其進行度量。

為此,我正在考慮比較數據框中的行數與原始文件中的行數。

我認為這符合我的要求:

someDataframe = pandas.read_csv(
   filepath_or_buffer=our_filepath_here,
   error_bad_lines=False,
   warn_bad_lines=True
)

initialRowCount = sum(1 for line in open('our_filepath_here'))
difference = initialRowCount - len(someDataframe.index))

但是運行它的硬件是非常有限的,當我們已經通過 .read_csv 完成整個事情一次時,我寧願不打開文件並遍歷整個事情來獲得行數。 有沒有人知道獲得成功處理的計數和 CSV 的初始行計數的更好方法?

雖然我沒有親自測試過,但我相信您可以通過捕獲它們並檢查返回的捕獲警告列表的長度來計算生成的警告數量。 然后將其添加到數據框的當前形狀中:

import warnings
import pandas as pd

with warnings.catch_warnings(record=True) as warning_list:
    someDataframe = pandas.read_csv(
       filepath_or_buffer=our_filepath_here,
       error_bad_lines=False,
       warn_bad_lines=True
    )

# May want to check if each warning object a pandas "bad line warning"
number_of_warned_lines = len(warning_list)

initialRowCount = len(someDataframe) + number_of_warned_lines

https://docs.python.org/3/library/warnings.html#warnings.catch_warnings


編輯:花了一點時間玩弄,但這似乎適用於 Pandas。 我們將暫時重定向stderr ,而不是依賴於內置的警告。 然后我們可以計算該字符串中出現“Skipping Lines”的次數,我們將以帶有此警告消息的壞行計數結束!

import contextlib
import io

bad_data = io.StringIO("""
a,b,c,d
1,2,3,4
f,g,h,i,j,
l,m,n,o
p,q,r,s
7,8,9,10,11
""".lstrip())

new_stderr = io.StringIO()
with contextlib.redirect_stderr(new_stderr):
    df = pd.read_csv(bad_data, error_bad_lines=False, warn_bad_lines=True)
    
n_warned_lines = new_stderr.getvalue().count("Skipping line")

print(n_warned_lines) # 2

暫無
暫無

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

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