为了账号安全,请及时绑定邮箱和手机立即绑定

比较 CSV 中的行数与 Pandas 成功处理为数据帧的行数?

比较 CSV 中的行数与 Pandas 成功处理为数据帧的行数?

Qyouu 2023-11-09 21:55:21
我们使用 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 的成功处理计数和初始行数吗?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

虽然我没有亲自测试过这一点,但我相信您可以通过捕获警告并检查返回的捕获警告列表的长度来计算生成的警告数量。然后将其添加到数据框的当前形状:


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


查看完整回答
反对 回复 2023-11-09
  • 1 回答
  • 0 关注
  • 61 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信