在熊猫中按几行拆分csv

时间:2019-06-28 09:36:42

标签: python pandas csv

我有一个带有几行标题的csv文件。接下来,我获得了sample(1)数据,接下来又是标头和sample(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

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

我尝试了以下循环:

  • 正在寻找[header]
  • 保存所有[header]行的索引编号。
  • 使用“打开”,我试图将所有隔离专区保存到新文件中

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

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

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

2 个答案:

答案 0 :(得分: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包含的内容

答案 1 :(得分:0)

另一个psedocode(或错误的真实代码)。唯一的变化是您没有将数据写入列表。

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()