python - 比较 CSV 中的行数与 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
编辑:花了一点玩弄,但这似乎适用于熊猫。我们将暂时重定向,而不是依赖内置的警告stderr
。然后我们可以计算该字符串中出现“跳过行”的次数,我们将以带有此警告消息的错误行数结束!
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
推荐阅读
- python - 点击 python Cli.testing TypeError
- haskell - 无法将类型“a”与“a1”匹配
- laravel - Laravel Eloquent - 无法查询与所有权的关系
- html - 带有三角形形状的 HTML5 正文背景 CSS
- python - 尝试使用 Opencv 和 Flask 显示多个流
- gnuplot - gnuplot 安装失败 - 目标“qtgnuplot_fr.qm”的配方失败
- javascript - 我怎样才能得到这个代码来计算金额列
- r - 修改 .RData 文件中的表
- python - 包含列子集的 CSV
- mysql - MYSQL 由于 Locking 导致性能下降