Pandas read_csv 未读取大数据文件中的所有条目

问题描述 投票:0回答:1

我有一个包含 100002 行的大型 .out 文件。我正在 VSCode 1.88.0 中工作并安装了 Python 3.12.2。我只读取文件中的两列数据:“Time”和“Sum(cvBot)”,但是当我使用 pandas 读取数据文件时,数据查看器中的许多条目都是 NaN,而它们不在我的原始文件中。 (例如,NaN 一直持续到第 10000 行,当我指定索引列时,类似的问题仍然存在)。在 VSCode 中查看的数据示例如下:

       Time         cvTop        cvBot      Sum(cvTop)   Sum(cvBot)     cvCh0        cvCh1         cTop        cRoot         cBot        cvRoot    Sum(cvRoot)  Sum(cvNEql) TLevel      cGWL        cRunOff   Sum(cRunOff)    (cv(i),    Sum(cv(i)), i=1,NObs)
        [T]        [M/L2/T]     [M/L2/T]      [M/L2]       [M/L2]       [M/L2]      [M/L2]        [M/L3]      [M/L3]        [M/L3]      [M/L2/T]      [M/L2]       [M/L2]              [M/L3]        [M/L2]      [M/L3]      [M/L2/T]      [M/L2]
        0.0010  0.00000E+00 -0.15405E-02  0.00000E+00 -0.15405E-05  0.00000E+00  0.00000E+00  0.29945E+03  0.00000E+00  0.15410E+04  0.00000E+00  0.00000E+00  0.00000E+00       1  0.00000E+00  0.00000E+00  0.00000E+00  0.29385E+03  0.29385E+00 -0.54338E+04 -0.54338E+01 -0.16439E+05 -0.16439E+02 -0.64983E+04 -0.64983E+01
        0.0020  0.00000E+00  0.43077E-02  0.00000E+00  0.27673E-05  0.00000E+00  0.00000E+00  0.30023E+03  0.00000E+00  0.15410E+04  0.00000E+00  0.00000E+00  0.00000E+00       2  0.00000E+00  0.00000E+00  0.00000E+00  0.29437E+03  0.58822E+00 -0.43086E+04 -0.97424E+01 -0.93670E+04 -0.25806E+02 -0.70594E+04 -0.13558E+02
        0.0030  0.00000E+00  0.43077E-02  0.00000E+00  0.70750E-05  0.00000E+00  0.00000E+00  0.30070E+03  0.00000E+00  0.15410E+04  0.00000E+00  0.00000E+00  0.00000E+00       3  0.00000E+00  0.00000E+00  0.00000E+00  0.29460E+03  0.88282E+00 -0.37590E+04 -0.13501E+02 -0.70042E+04 -0.32811E+02 -0.68129E+04 -0.20371E+02

.
.
.
        2.8186  0.00000E+00 -0.71450E-02  0.00000E+00  0.43578E-03  0.00000E+00  0.00000E+00  0.21151E+07  0.00000E+00  0.15397E+04  0.00000E+00  0.00000E+00  0.00000E+00     998  0.00000E+00  0.00000E+00  0.00000E+00  0.18807E+07  0.41397E+06 -0.24422E+04 -0.70533E+03  0.91943E+02 -0.62800E+02  0.25422E+02 -0.37256E+03
        2.8193  0.00000E+00 -0.71450E-02  0.00000E+00  0.43083E-03  0.00000E+00  0.00000E+00  0.21229E+07  0.00000E+00  0.15397E+04  0.00000E+00  0.00000E+00  0.00000E+00     999  0.00000E+00  0.00000E+00  0.00000E+00  0.18877E+07  0.41528E+06 -0.24486E+04 -0.70702E+03  0.91960E+02 -0.62737E+02  0.25429E+02 -0.37255E+03
        2.8200  0.00000E+00 -0.71450E-02  0.00000E+00  0.42588E-03  0.00000E+00  0.00000E+00  0.21307E+07  0.00000E+00  0.15397E+04  0.00000E+00  0.00000E+00  0.00000E+00    1000  0.00000E+00  0.00000E+00  0.00000E+00  0.18946E+07  0.41660E+06 -0.24551E+04 -0.70872E+03  0.91977E+02 -0.62673E+02  0.25435E+02 -0.37253E+03

如果有人感兴趣,这里是数据文件的链接:Data

我的 VSCode 数据查看器的图像在这里,因为我无法复制粘贴输出。 Dataout

我的目的是读取两列数据,以便我可以绘制时间序列。当前读取和绘制数据的代码是:

import matplotlib.pyplot as plt
import pandas as pd


# Load time series data from a file
file_path = r'C:\Program Files\Hydrus-1D\Examples\Direct\Attempt10\solute1_Copy.out'

data = pd.read_csv(file_path, usecols=["Time", "Sum(cvBot)"], index_col=False, skiprows=[1], sep = " ")

我还使用其中一列(“TLevel”)作为索引列,但数据行在第 15370 行之前记录为 NaN。

我浏览过讨论类似问题的页面,例如Pandas read_csv 未读取文件中的所有行,但我无法让它工作。我不确定问题是什么,但有额外的数据列,在我的数据集中最右边的列可能有也可能没有标签,这可能是一个原因。有没有办法让 pandas 正确读取我的数据文件?

python-3.x pandas dataframe csv
1个回答
0
投票

您的文件需要先整理好,然后 pandas 才能正确读取它。有很多随机且不一致的空白使用,因此只需清理即可。以下代码删除所有前导和尾随空格,并将列之间不一致的空格转换为单个空格:

import matplotlib.pyplot as plt
import pandas as pd
import re
import io


# Load time series data from a file
file_path = r'C:\Program Files\Hydrus-1D\Examples\Direct\Attempt10\solute1_Copy.out'

with open(file_path) as f:
    lines = f.readlines()
    lines = [line.strip() for line in lines]
    file_contents = '\n'.join(lines)

file_contents = re.sub(' +', ' ', file_contents)

data = pd.read_csv(io.StringIO(file_contents), usecols=["Time", "Sum(cvBot)"], index_col=False, skiprows=[1], sep = " ")

如果想更简洁,清洁步骤可以简化为两行:

with open(file_path) as f:
    file_contents = re.sub(' +', ' ',  '\n'.join([line.strip() for line in f.readlines()]))

注意

io.StringIO()
调用,因为这会将字符串转换为 pandas 用来读取的类似文件的对象。

这应该允许 pandas 正确读取数据,但请注意,您可能需要根据您的用例指定预期数据的类型。

© www.soinside.com 2019 - 2024. All rights reserved.