Python 将多个数据集的csv文件组织到数据帧列表中

Python 将多个数据集的csv文件组织到数据帧列表中,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个csv文件,包含计算流体力学(CFD)模拟的结果(我的csv文件的一个示例作为google驱动器链接附加;文件大小:226KB)。特别是,csv文件包含关于多条流线的信息(x、y和z坐标以及三个方向上的速度,因此总共有六列)(流线的数量可能因情况而异)。有关流线的信息由两个空行分隔(请参见示例csv文件)。流线的行数可能不同 我需要读取此csv文件,并将其数据组织到Pandas datafreames列表中,如: streamlineList = [df_for_streamline_1

我有一个csv文件,包含计算流体力学(CFD)模拟的结果(我的csv文件的一个示例作为google驱动器链接附加;文件大小:226KB)。特别是,csv文件包含关于多条流线的信息(x、y和z坐标以及三个方向上的速度,因此总共有六列)(流线的数量可能因情况而异)。有关流线的信息由两个空行分隔(请参见示例csv文件)。流线的行数可能不同

我需要读取此csv文件,并将其数据组织到Pandas datafreames列表中,如:

streamlineList = [df_for_streamline_1, df_for_streamline_2, ...., df_for_streamline_N]
谁能帮我个忙吗


下面的内容应该适合您

导入csv
作为pd进口熊猫
def main():
文件名='track0\U.csv'
#确保CSV具有标题值
以csvfile形式打开(文件名):
sniffer=csv.sniffer()
尝试:
嗅探器.has_头(csvfile.read(1024))
除了csv。错误:
打印('CSV文件必须有标题行')
回流管#末端总管
以csvfile形式打开(文件名):
#创建一个CSV阅读器
csv\u reader=csv.reader(csvfile)
#提取数据帧的标题信息
标题=下一个(csv\U读卡器)
#初始化数据帧存储列表
流_线_数据_帧=[]
#初始化流数据列表
单_流_数据=[]
#循环CSV中的每一行(标题除外)
对于csv_读取器中的行:
如果行:#行有数据
单流数据。追加(行)#添加到流数据
else:#找到空行
#流中的数据
如果是单流数据:
#将流转换为DF并附加到列表
stream\u line\u data\u frames.append(pd.DataFrame(single\u stream\u data,columns=header,dtype='float64'))
#空流数据
单_流_数据=[]
#使用流\u线\u数据\u帧执行任何操作
#在这里,我只是打印出每个流在它自己的csv
对于i,枚举中的流(流\线\数据\帧):
stream.to_csv(f'stream_{i}.csv',encoding='UTF-8',index=False)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
程序首先测试csv文件是否有头。这对于使用列名构建数据框架是必要的。如果这个方面对您的用例不重要,您可以删除它

然后,程序逐行遍历剩余的csv行,并将它们临时添加到列表
single\u stream\u data
。当发现一个空行时,它会测试
单流数据
列表中是否有数据

如果它有数据,它将被转换为数据帧并附加到
stream\u line\u data\u frames
列表中

如果遇到一个空行并且
单流\u数据
为空,我们将不执行任何操作并继续下一行

作出了一些假设:

  • 最后一个流以至少一个空行结束
    • 这在示例csv中是正确的,但要求最后一个数据帧最终出现在
      stream\u line\u data\u frames
      列表中
  • 所有流的标题都相同
  • 所有流的列数相同
  • 任意数量的空行表示流已结束。
    • 如果希望流中有空行,可以添加一个计数器,以确保流之间正好有2个空行

谢谢。我只是不知道为什么在创建数据帧之后我的值是字符串,所以我不能对它们进行数学运算。有什么想法吗?我在数据帧声明中添加了
dtype='float64'
(并更新了我的答案),以鼓励CSV中的值作为float64。请注意,会有一些舍入,但您可以将它们用作数字。谢谢!一个简单的问题:如果我想在循环行的过程中只添加选定的列,我应该怎么做?假设我想读取另一个csv文件(在同一函数中),该文件具有相同的x、y和z数据点,但第四列是另一个变量(例如压力,p);为了避免冗余,我只想读取这个新文件中的第四列,并将其数据附加为现有数据帧的最后一列,这样最终的数据帧将有7列,x、y、z、U_0、U_1、U_2(来自第一个csv文件)和p(来自第二个csv文件)。如果我必须以新问题的形式发布,请告知我。是的,以更具体的示例发布自己的问题是最好的。好的,谢谢,我可以自己解决这个问题,但我在这里发布了另一个类似的问题: