【问题标题】:How can I periodically skip rows reading txt with pandas?如何定期跳过使用熊猫阅读 txt 的行?
【发布时间】:2019-03-30 20:28:52
【问题描述】:

我需要处理整个 2018 年每 20 秒测量一次的数据,原始文件具有以下结构:

约会时间很多垃圾

在几行

样本量再次被丢弃

数据

约会时间很多垃圾

等等

我想为它制作一个 pandas 数据帧或每个数据块(其大小编码为样本量)至少一个数据帧,以节省测量时间。

如何忽略所有其他数据垃圾?我知道它是定期编写的(周期 = 样本数量),但是: - 我不知道文件中有多少个字符串 - 我不想在循环中使用显式方法 file.getline(),因为它会无休止地工作(尤其是在 python 中)而且我没有足够的计算能力来使用它

是否有任何方法可以在 pandas 或其他库中定期跳过行?或者我还能怎么解决?

我的数据有一个例子:

https://drive.google.com/file/d/1OefLwpTaytL7L3WFqtnxg0mDXAljc56p/view?usp=sharing

我想获得类似于图片上的数据表的数据框 + 带有日期时间的附加列,没有技术行

【问题讨论】:

  • 你看过documentation中的skiprows参数吗?
  • 我有,你必须有索引列表才能跳过才能使用它,而知道这一切的唯一方法就是循环计数,什么意思(因为我不知道如何计数行而不阅读它们,这个问题也在这里)我需要用 file.getline() 读取我的所有数据我错过了 smt 吗?
  • 我和 RafealC 是否正确理解了您的问题?
  • 哦,不确定,我再试一次:我需要跳过 5 行,读取 56,跳过 5 等等。由于数据的大小,我不能在一个循环中逐行读取,而且我不知道如何获取有关文件中有多少行的信息。是不是更清楚了?

标签: python pandas


【解决方案1】:

使用itertools.islice,其中N 表示read every N lines

from itertools import islice

N = 3
sep = ','

with open(file_path, 'r') as f:
    lines_gen = islice(f, None, None, N)
    df = pd.DataFrame([x.strip().split(sep) for x in lines_gen])

【讨论】:

  • 谢谢,仔细看,但这并不是我所需要的——我需要阅读 56 行,然后跳过 5 行,然后再次阅读 56 行,依此类推。所以 step 无法帮助我处理这个问题
  • @Alexandra 每 61 行读取一次并切片,直到索引 -5,即 [:-5]
  • 似乎我理解了这个问题:我不仅需要获得第 61 行(或每第 61 行),还需要获得整个 61 行 :) 这不是单行。不好意思表达不好
【解决方案2】:

我重复了你的数据三遍。听起来您需要每 4 行(不是从 0 开始),因为那是您的数据所在的位置。在 documentation for skipsrows 它说。

如果可调用,可调用函数将根据行索引进行评估,如果应该跳过该行,则返回 True,否则返回 False。一个有效的可调用参数的例子是 lambda x: x in [0, 2]。

那么如果我们将not in 传递给lambda 函数呢?这就是我在下面所做的。 我正在创建一个我想要保留的值的列表。并将not in 传递给skiprows 参数。在英文中,跳过所有不是每 4 行的行。

import pandas as pd

# creating a list of all the 4th row indexes. If you need more than 1 million, just up the range number
list_of_rows_to_keep = list(range(0,1000000))[3::4]

# passing this list to the lambda function using not in.
df = pd.read_csv(r'PATH_To_CSV.csv', skiprows=lambda x: x not in list_of_rows_to_keep)
df.head()

#output
0  data
1  data
2  data

【讨论】:

  • 问题是我不知道最高限制(在您的示例中为 100 万),但我已经使用 wc -l ubuntu 命令在预处理开始时从每个文件中获取它并计算循环中的颠簸行数:)所以我想我应该结束这个问题,无论如何谢谢!
【解决方案3】:

只需计算文件中有多少行,然后将它们的列表(可能称为 useless_rows)放入 pandas.read_csv(..., skiprows=useless_rows) 中。

我的问题是筹码排数。 有几种方法可以做到:

  1. 在 Linux 上的命令“wc -l”(这里是如何将其放入代码中的说明:Running "wc -l <filename>" within Python Code

  2. 发电机。我的相关行中有一个键:它在最后一列。不是很丰富,但对我来说是救援。所以我可以用它来计算字符串,看起来它大约有 500000 行,并且需要 0.00011 来计算

    with open(filename) as f:
        for row in f:
            if '2147483647' in row:
                continue
            yield row
    

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2022-08-17
    • 2020-04-18
    • 2017-08-08
    • 1970-01-01
    • 2018-11-09
    • 2019-01-23
    相关资源
    最近更新 更多