【问题标题】:Correctly splitting a CSV file after repetition in pandas在 Pandas 中重复后正确拆分 CSV 文件
【发布时间】:2019-03-25 00:20:47
【问题描述】:

我有包含 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 将其拆分为几个文件。我不知道我该怎么做。我编写了整个脚本来处理一些生物材料,但是其中一种文件类型(上图)会产生问题,因为它是多个文件合二为一。而且脚本不想使用它。

我已经阅读了很多关于拆分文件的内容,但是在 pandas 中重复值后我没有发现任何关于拆分的内容。

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

【问题讨论】:

  • 内容大小是否恒定?如果是,您可以使用计数变量来跟踪新部分的开始时间。如果不是,您可以在无限循环中读取内容行,并在非内容行(这将是新标题)上设置break 条件。
  • 不,大小不是恒定的。但打破声明这是个好建议,谢谢你!我稍后会尝试。

标签: python pandas csv split


【解决方案1】:

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

您可以创建result 列表并将每个块数据存储在列表的单独元素中(例如,在字典中)。如果您读取非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(', '))

【讨论】:

  • 太棒了!效果很好。非常感谢!
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 2020-01-10
  • 2021-05-21
  • 2023-04-02
  • 2019-07-11
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多