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

2024-06-07 05:18:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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]

谁能帮我个忙吗

https://drive.google.com/file/d/1GCSIOrlrXDWjlWMkEWMTE36Wv7wlYD5b/view?usp=sharing


Tags: 文件csv信息示例dffor数量链接
1条回答
网友
1楼 · 发布于 2024-06-07 05:18:26

下面这样的东西应该适合你

import csv

import pandas as pd


def main():
    file_name = 'track0_U.csv'

    # Ensure CSV has Header Values
    with open(file_name) as csvfile:
        sniffer = csv.Sniffer()
        try:
            sniffer.has_header(csvfile.read(1024))
        except csv.Error:
            print('CSV File must have header row')
            return  # End Main

    with open(file_name) as csvfile:
        # Create a CSV Reader
        csv_reader = csv.reader(csvfile)
        # Extract Header Information for Data Frame
        header = next(csv_reader)
        # Initialise DataFrame Storage List
        stream_line_data_frames = []
        # Initialise the Stream Data List
        single_stream_data = []
        # Loop over each row (except header) in CSV
        for row in csv_reader:
            if row:  # Row Has Data
                single_stream_data.append(row)  # Add to Stream Data
            else:  # Empty Row Found
                # Data in the stream
                if single_stream_data:
                    # Convert Stream to DF and append to list
                    stream_line_data_frames.append(pd.DataFrame(single_stream_data, columns=header, dtype='float64'))
                    # Empty Stream Data
                    single_stream_data = []

        # Do whatever you want with stream_line_data_frames
        # Here I just print out each stream in it's own csv
        for i, stream in enumerate(stream_line_data_frames):
            stream.to_csv(f'stream_{i}.csv', encoding='UTF-8', index=False)


if __name__ == '__main__':
    main()

程序首先测试csv文件是否有头。这对于使用列名构建数据框架是必要的。如果这个方面对您的用例不重要,您可以删除它

然后,程序逐行遍历剩余的csv行,并将它们临时添加到列表single_stream_data。当找到一个空行时,它会测试single_stream_data列表中是否有数据

如果它有数据,它将转换为数据帧并附加到stream_line_data_frames列表中

如果遇到空行且single_stream_data为空,则不执行任何操作并继续下一行

作出了一些假设:

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

相关问题 更多 >