在导入到pandas之前跳过每一行指定的行数

14 浏览
0 Comments

在导入到pandas之前跳过每一行指定的行数

我有一个数据文件,我需要跳过某些行。\n

(1 1),skip,this
skip,this,too
1,2,3
4,5,6
7,8,9
10,11,12
(1 2),skip,this
skip,this,too
...

\n它们在每4个数据条目后重复一次。我尝试了来自这个帖子的方法Pandas: ignore all lines following a specific string when reading a file into a DataFrame ,但是没有跳过任何行,而且它将数据帧转换为了多索引。\n我尝试使用startswith()进行循环,并将其附加到一个列表中,但是数据被输入到了单个列中。\n我想要获得以下输出:\n

1,2,3
4,5,6
7,8,9
10,11,12

\n有多个文件,每个文件包含超过7M行。我正在寻找一种快速、内存高效的方法来完成这个任务。\n我尝试了创建一个跳过行0,1,然后是6,7的列表。通过这种方法是否可行?

0
0 Comments

问题的出现原因:

在导入pandas之前,有时候需要跳过一些指定的行。这可能是因为文件中包含了一些不需要的内容,或者需要忽略的行数。然而,pandas没有提供一个直接的方法来跳过指定的行,因此需要使用其他方法来解决这个问题。

解决方法:

一种解决方法是先确定需要跳过的行数,然后在导入pandas之前,生成一个包含要跳过行数的列表。可以使用以下步骤来实现:

1. 首先,使用一种方法来确定文件中的行数。可以参考这个链接:Count how many lines are in a CSV Python?,该链接提供了一种计算CSV文件行数的方法。

2. 然后,生成一个包含要跳过行数的列表。在以上代码示例中,首先生成一个包含0到9的列表a。然后,使用步长为6来生成跳过行数的列表rows。这是通过将a列表切片为两个子列表,一个从索引0开始,每隔6个元素取一个,另一个从索引1开始,每隔6个元素取一个。然后将两个子列表合并,并进行排序,生成最终的跳过行数的列表rows。

3. 最后,使用pandas的read_csv函数来读取文件,并在参数skiprows中传入跳过行数的列表rows。设置header参数为None,表示不将文件的第一行作为列名。

通过以上步骤,就可以在导入pandas之前跳过指定的行数,并将文件读取到DataFrame中。在以上代码示例中,最终输出的DataFrame包含了跳过指定行数后的文件内容。

这种方法的好处是可以根据需要灵活地指定要跳过的行数,适用于各种情况下需要忽略特定行的需求。

0
0 Comments

从上述内容中可以整理出以下问题的出现原因和解决方法:

问题:如何在导入pandas之前跳过指定的行?

原因:根据内容中的描述,似乎无法直接在pandas中根据特定的条件跳过行。因此,需要在导入数据之前对文件进行预处理。

解决方法:可以使用以下方法在导入pandas之前跳过指定的行:

1. 使用Python的文件操作功能,可以使用以下代码在导入pandas之前预处理文件:

with open("file.csv") as rp, open("outfile.csv", 'w') as wp:
    for line in rp:
        if 'skip' not in line:
            wp.write(line)

上述代码会逐行读取原始文件(file.csv),并将不包含指定条件('skip')的行写入新文件(outfile.csv)。这样,在导入pandas时,可以使用新文件作为输入。

2. 这种方法是一种内存高效的解决方案,因为它避免了将整个文件加载到内存中。

需要注意的是,这种方法实际上是通过创建一个新文件或生成一个“内存中”的文件来跳过特定的行,而不是直接在pandas中跳过行。

0
0 Comments

问题:在将数据导入到pandas之前,如何跳过指定行?

原因:在导入数据之前,需要跳过某些行,因为这些行不是有效的数据行。在给定的代码中,使用了不同的方法来跳过指定行的数据。

解决方法:

1. 方法一:通过跳过两行并从csv reader对象中选择四行的切片来实现。使用islice和chain模块来实现跳过和切片操作。

from itertools import islice, chain
import pandas as pd
import csv
def parts(r):
    _, n = next(r), next(r)
    while n:
        yield islice(r, 4)
        _, n = next(r, ""), next(r, "")
with open("test.txt")as f:
    r = csv.reader(f)
    print(pd.DataFrame(list(chain.from_iterable(parts(r)))))

2. 方法二:将chain对象传递给`pd.DataFrame.from_records`方法来创建DataFrame。

with open("test.txt")as f:
    r = csv.reader(f)
    print(pd.DataFrame.from_records(chain.from_iterable(parts(r))))

3. 方法三:使用一个函数来跳过指定行,并以更通用的方式处理数据。使用consume函数来跳过行。

from itertools import islice, chain
from collections import deque
import pandas as pd
import csv
def consume(iterator, n):
    if n is None:
        deque(iterator, maxlen=0)
    else:
        next(islice(iterator, n, n), None)
def parts(r, sec_len, skip):
    consume(r, skip)
    for sli in iter(lambda: list(islice(r, sec_len)), []):
        yield sli
        consume(r, skip)
with open("test.txt")as f:
    r = csv.reader(f)
    print(pd.DataFrame.from_records((chain.from_iterable(parts(r, 4, 2)))))

4. 方法四:将数据写入StringIO对象,并将其传递给pandas的read_csv函数。

from io import StringIO
def parts(r, sec_len, skip):
    consume(r, skip)
    for sli in iter(lambda: list(islice(r, sec_len)), []):
        yield "".join(sli)
        consume(r, skip)
with open("test.txt")as f:
    so = StringIO()
    so.writelines(parts(f, 4, 2))
    so.seek(0)
    print(pd.read_csv(so, header=None))

上述方法可以根据具体需求选择适合的方法来跳过指定行,并将数据导入到pandas中。如果在处理实际文件时出现`MemoryError`错误,可以尝试使用分块读取的方式,并使用concat函数来合并数据。

0