【问题标题】:Parsing a data file with Pandas where headers may change position使用 Pandas 解析数据文件,其中标题可能会更改位置
【发布时间】:2020-05-15 04:46:27
【问题描述】:

我必须为我们在工作中使用的数据文件编写一个解析器。我选择 Pandas 是因为我读过它的速度非常快,而且性能是它的一大重点。顺便说一句,我今天之前从未使用过 Pandas。

据我了解,我需要告诉 Pandas 我的标题行在类似 CSV 的文件中的位置。但是在实际数据开始之前,工作中的文件可能有可变数量的行。

例子:

Software :SomeCorpSoft 2.3.4
Measurement Name;default
Created;2017-11-30T11:42:09Z
Scan Type;Threshold scan
Serial Number;A-SERIAL-NUM-1234
Sensor Nickname;
Trend Count;1
Trigger Level;0
Trigger Holdoff;0
start;0
end ;0

F1; 44.12; H; 8;
Time;F1 ;V 1 ;Hp 1 ;C 1 ;P 1 ;V 2 ;Hp 2 ;C 2 ;P 2 ;V 3 ;Hp 3 ;C 3 ;P 3 ;V 4 ;Hp 4 ;C 4 ;P 4 ;V 5 ;Hp 5 ;C 5 ;P 5 ;V 6 ;Hp 6 ;C 6 ;P 6 ;V 7 ;Hp 7 ;C 7 ;P 7 ;V 8 ;Hp 8 ;C 8 ;P 8 ;
0;13.448671;349.458099365;0;7.72320135575;-105.609801195;8.54580983665;-15.5168133183;0.0477259658688;101.686749515;4.46981738574;152.711715748;0.0728701513916;77.1428145399;17.8438225472;-163.940792731;0.95931622744;48.4915601658;0.525170185762;-85.3977558257;0.255517896038;-58.4781138655;2.0410204213;131.266863348;0.291022526301;-145.942080277;12.7706899744;-150.335793306;1.3724642398;-161.919972567;5.3790623792;-148.609825665;0.512542366745;-177.811876518;

所以在这个例子中,我的实际标题在第 14 行(如果它忽略空行,则为 13,不确定),它以 Time 开头(这是一个常数,所以也许一些lambda 方式来考虑这一点?)

但我还需要前面几行,以便在数据库中形成不同的对象(例如,“Created;”给了我测量的时间)。

然后我必须为每个标题创建对象实例。它们确实与下面的数据一致,例如:

Time -> 0
F1 -> 13.448671
V1 -> 349.458099365
... so on...

所以我有

import pandas as pd

df = pd.read_csv(file_dir)
for i in df.values:
    for x in i:
        if "Software" in x:
            software_ver = x.split(':')[1]
        if "Time" in x:
            headers = x

但这感觉“便宜”?可能有一种 Pandas 方法可以做到这一点。在那之后,我计划在标题之后对每一行进行压缩,因为它们都匹配,这样我就可以将值与标题配对,但同样,这可能是一种更好的方法,更有效。

这些文件可能有几十万行,我必须为每一行的每个标题元素创建一个对象实例。我们当前的解析器需要几分钟的时间,但我需要把时间缩短。

【问题讨论】:

  • skiprows 可能有帮助吗?类似pd.read_csv(file_dir, skiprows=13)
  • 我读过有关skirows的信息,但我的主要问题是13有时可能是10、9或17等。而且我还需要标题之前的信息,所以可能不需要想跳过吗?
  • Pandas 和这个有什么关系?你不是想写一个解析器吗? Pandas 可以读取 CSV,是的,但需要事先解析和清理这些数据。
  • 文件的解析是第一步,当然,但是我必须对解析得到的类似 CSV 的输出做很多事情。而且我需要能够快速处理二维数组结构中的大量数据的东西。我认为熊猫是首选?如果需要,我可以用其他东西解析和准备数据,然后将清理后的二维数组传递给 Pandas。我只是认为 Pandas 有一个强大的解析方面可以处理我的用例。

标签: python pandas csv multidimensional-array


【解决方案1】:

Pandas 不是解析器。在数据处理方面,它是一个很棒的库,它为简单的数据格式提供了一些解析器。这种文件格式不能用 Pandas 解析,至少不能简单而且可能效率不高。

pandas 是否相关取决于您想要进行的处理。如果您打算能够进行中等复杂度的操作,它可能是。如果你只需要提供一个数据库表,那就算了。

如果需要高性能,您可能也应该忘记 Python。它确实是一门优秀的语言,我真的很喜欢用 Python 编程。但是如果只要求尽快解析文件,我会使用C。如果涉及到数据库,首先要优化的部分不是文件解析,而是数据库访问。

换句话说,就像用锤子敲螺丝一样。最后螺丝将在板内,如果你只有一把锤子,它可能是解决方案。不过最好用螺丝刀……

【讨论】:

  • 嗯,这个项目是一个网站,在 Django 上运行,带有一个 PostgreSQL 数据库。我以前使用过 Cython,但我的东西绝对不是 C。这就是我使用 Python 的原因。用户上传一个文件,我必须解析它,并从中创建对象,以便我可以通过 Django 将其批量插入到数据库中。在这种情况下你会采取什么方法?我对 Pandas 并没有死心,但我认为这是我最快的选择。
  • Pandas 消耗内存。对于多用户网站来说看起来不太好。我更好地理解了为什么需要 Python,所以我将分析直接解析 (split) 与 csv 模块。我也会尝试绕过 Django 并直接插入数据库。但也许最好的选择是接受耗时的事情并在后台进行 bht 处理。我几乎不能说更多:这确实是一种架构选择。如果在您的特定用例中内存不是问题,那么 pandas 可能会很有用。我刚刚警告过你,这不是万能的灵丹妙药……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多