在熊猫中重复后正确分割CSV文件

时间:2019-03-25 00:20:48

标签: python pandas csv split

我有包含5000行的CSV,每几百行CSV行有一个重复部分。
将这个文件分成几个不同的文件,最有效的选择是什么?

文件外观

Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
....
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2
....
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3

我需要通过Header将其拆分为几个文件。而且我不知道该怎么办。我写了整个脚本来处理一些生物学的东西,但是其中一种文件类型(上面)产生了问题,因为它是多个文件。而且该脚本不想使用它。

我已经阅读了很多有关拆分文件的信息,但是在重复熊猫中的值之后,我对拆分没有任何了解。

在这种情况下,它将是3个文件(但是文件中这些文件的数量不同)

1 个答案:

答案 0 :(得分:1)

正如我在评论中建议的那样,我发现了比break语句更好的解决方案:

您可以创建result列表,并将每个块数据存储在列表的单独元素中(例如dict)。如果您读取的不是 Header 行,则可以保证您刚刚读取的行与当前数据块相关。而且当前数据块是result列表中的最后一个元素,因此您可以对其进行修改。如果您阅读 Header 行,只需将新元素附加到result并开始向其中写入新的块数据。

如果内容的大小是恒定的,则可以使用itertools.cycle迭代器来“整理”解析过程:

from itertools import cycle

text1 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2"""
size = 5
iterator = cycle(range(size))
result = []
for line in text1.split('\n'):
    i = next(iterator)
    if i == 0:
        result.append({'header': line})
    elif i == 1:
        result[-1]['num_of_samples'] = line
    elif i == 2:
        result[-1]['content_header'] = line
    elif i == 3:
        result[-1]['content'] = [line.split(', ')]
    else:
        result[-1]['content'].append(line.split(', '))

如果您不知道内容的大小,则应解析每一行,检查其类型并手动构造数据:

text2 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
b1, bb1, bbb1
Header2
number of Samples2
Content2
b2, bb2, bbb2
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3"""
result = []
i = 0
for line in text2.split('\n'):
    if line.startswith('Header'):  # Your condition for headers
        result.append({'header': line})
    elif line.startswith('number'):  # Your condition for number of samples
        result[-1]['num_of_samples'] = line
    elif line.startswith('Content'):  # Your condition for content headers
        result[-1]['content_header'] = line
    else:
        if 'content' not in result[-1]:  # We don't know is the content list created
            result[-1]['content'] = [line.split(', ')]
        else:
            result[-1]['content'].append(line.split(', '))