【问题标题】:Splitting csv by few rows in Pandas在 Pandas 中将 csv 按几行拆分
【发布时间】:2019-06-28 18:50:06
【问题描述】:

我有一个带有几行标题的 csv 文件。接下来我得到一个样本(1)数据,接下来是标题和样本(2)数据。样本(和标题)的数量在文件中不是恒定的。

DF 看起来像这样:

[header]
InfoMap : 4214
InfoSample:3122
Content:,   ,22dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Ana           22          785             a6659
Ana           22          785             a658141
Ana           22          785             csd449
Ben           23          756             a6659
Ben           23          756             a658141
Charlie       44          733             c658141
[header]
InfoMap : 423421
InfoSample:315
Content,   ,562dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Cris           82          7835             a6659
Cris           82          7485             a658141
Cris           82          7485             csd449
MATT           53          268              a6659
MATT           53          268              a658141
Dan            42          885              c658141

我尝试做的事情: 我需要将带有样本的每个标题拆分为新文件。所以在上面的情况下,我应该得到 2 个文件:

文件1:

[header]
InfoMap : 4214
InfoSample:3122
Content:,   ,22dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Ana           22          785             a6659
Ana           22          785             a658141
Ana           22          785             csd449
Ben           23          756             a6659
Ben           23          756             a658141
Charlie       44          733             c658141

文件2:

[header]
InfoMap : 423421
InfoSample:315
Content,   ,562dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Cris           82          7835             a6659
Cris           82          7485             a658141
Cris           82          7485             csd449
MATT           53          268              a6659
MATT           53          268              a658141
Dan            42          885              c658141

如何在 pandas 或核心 Python 中以最简单的方式做到这一点?正如我所说,标题和样本的数量不是恒定的。

我通过循环尝试了:

  • 在行中寻找 [header]
  • 保存所有 [header] 行索引号的编号。
  • 通过“打开”我尝试将所有隔间保存到新文件中

问题是:我无法将其读取为 csv,因为它是一列数据帧(因为标题),行以一种奇怪的方式读取,因为我的文件包含混合样本。

我正在寻找更好的概念。也许 Pandas 有一些我不知道的功能。如果没有,我会继续我的做事方式,并尝试这样做。

我不一定要寻找现成的解决方案,而是一些提示或概念。

【问题讨论】:

  • 请分享您已经尝试过的代码。使用python CSV模块读取csv文件,然后遍历每一行,将行数据保存在列表中,如果计数大于1或达到最后一行,则检查“InfoMap”的计数,然后将列表写入另一个csv文件名称 file1, file2 ... filen_N
  • 添加了伪代码因为我删除了我的概念。它确实有效。
  • 如果您正在处理大文件,可能值得将数据直接写入目标文件,而不是存储到中间列表中。这样你就不会增加你的记忆负担。不过,对于小文件,这无关紧要。

标签: python pandas csv


【解决方案1】:

这是根据我在评论中给出的逻辑的伪代码示例代码,假设“InfoMap”是标题的起点:

dataList = []
with open('YourData.csv', newline='') as File:  
        reader = csv.reader(File)
        dataList = []
        count = 0
        for row in reader:
            if "InfoMap" in row[0]:
                count += 1
                if count > 1:
                    #fileName = "file" + str(count)
                    #WriteDataListToCSV(dataList, fileName) create a function that can write dataList into csv 
                    #print(dataList)
                    dataList = []
                    dataList.append(row)
                else:
                    dataList.append(row)
            else:
                dataList.append(row)
        #fileName = "file" + str(count)
        #WriteDataListToCSV(dataList)  
        #print(dataList)

您可以取消注释打印语句以查看 dataList 包含的内容

【讨论】:

    【解决方案2】:

    另一个伪代码(或有缺陷的真实代码)。唯一的变化是您不将数据写入列表。

    file_no = 0
    write_file = open(f"sub_file_{file_no}.csv", "a+")
    with open("input.csv") as in_file:
        reader = csv.reader(in_file)
        for row in reader:
            if row[0] == "[header]":
                # At the start of a new file. Close the old, increment count, open new
                write_file.close()
                file_no += 1
                write_file = open(f"sub_file_{file_no}.csv", "a+")
            # Just pass current row into the currently open file
            write_file.write(row)
    write_file.close()
    

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2019-08-21
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多