【问题标题】:Append multiple csv files from different sub-directories into one big file将来自不同子目录的多个 csv 文件附加到一个大文件中
【发布时间】:2021-08-11 19:22:01
【问题描述】:

我目前正在使用太阳能电池板的随机森林机器学习技术构建手势检测系统。我有 6 种不同的手势(顺时​​针、滑动、张开拳头等)。我从 2 名参与者那里收集了每个手势的数据。虽然,我正在努力为我的项目上传和组织数据以准备培训、测试和验证。

两名参与者重复每个手势 30 次。我使用的 PicoScope 软件记录了两个变量,时间和电压。这都保存在一个 csv 文件中。时间在所有文件中都是常数,但电压会根据上面执行的手势而变化。

我有多个文件,保存在多个文件夹中。我的数据是这样排列的:

  • 我目前有两个文件夹,参与者 1,参与者 2。
  • 在参与者文件夹中还有 6 个文件夹来表示他们执行的每个手势 (顺时针、滑动、张开拳头等)
  • 在每个手势文件夹中有 30 个 csv 文件,即 30 重复该特定手势
  • 然后 csv 文件包含两列,时间和电压,包含 15,007 数据点。目标按其存储的文件夹分类 下

例如 - Participant1/Clockwise/Clockwise_23.csv

我将在此处留下数据集的链接:link dataset

我以前从未使用过多个文件进行机器学习,我相信我必须将所有文件附加在一起,然后才能输入机器学习模型。我将上传一张我认为这些数据应该是什么样子的图片。左边是数据当前的样子,右边是数据应该如何格式化? format

我一直在研究追加,但我没有看到任何接近这种复杂性的东西。我有多个子目录。我想要一个包含所有 csv 文件的数据集,其中包含时间、电压及其生成的手势目标。它的手势目标可以通过它所在的文件夹找到。有人可以帮我解决这个问题吗?

我已经设法将所有文件附加在一起 ​​- 但目前,所有文件都被添加到相同的两个标题下,给我留下了 5507348 列。我希望每个文件数据都可以通过它自己的标签来识别。一行是时间,然后是下面的每个文件电压读数,最后是结果目标(保存文件的文件夹)

【问题讨论】:

  • 基本上你想将文件路径(例如 Participant1/Clockwise/Clockwise_23)作为输出文件中最左边的 3 列,然后是该文件中已有的列。如果您可以计算出如何枚举所有文件(查看os.path.walk()),那么您就有了这 3 列的值以及要扫描的文件的名称。依次读取每个文件,添加识别列,然后将标记数据写入单个文件。 csv 模块将非常简单地处理这个问题。毫无疑问,您会被告知“使用pandas”,但是如果有这么多数据,您可能会耗尽内存或时间。

标签: python machine-learning append tensor


【解决方案1】:

如果我理解正确,您想遍历每个子目录并将所有文件加入一个更大的数据框。

在下面的代码中,我首先创建一个空数据框,然后遍历 2 层子目录,然后开始读取文件。这将遍历每个只有 2 层的子目录,并尝试将该级别的所有文件读入一个临时数据帧,然后再将所有内容连接到最终编译的数据帧中。

from pathlib import Path
import os
import pandas as pd

df = pd.DataFrame()

rootpathsting= 'C:\Users\YourName\RootDir'
rootdir = Path(rootpathsting)
level_1_dirs = [f for f in os.listdir(rootdir) if os.path.isdir(os.path.join(rootdir, f))]

for l1dir in level_1_dirs:
    print('Dir: ', l1dir)
    l1dirpathstring = rootpathsting + '\\' + l1dir
    l1dirpath = Path(l1dirpathstring)
    level_2_dirs = [f for f in os.listdir(l1dirpath) if os.path.isdir(os.path.join(l1dirpath, f))]
    for l2dir in level_2_dirs:
          print('Dir: ', l2dir)
          l2dirpathstring = l1dirpathstring + '\\' + l2dir
          l2dirpath = Path(l2dirpathstring)
          onlyfiles = [f for f in os.listdir(l2dirpath) if os.path.isfile(os.path.join(l2dirpath, f))]
          for f in onlyfiles:
                print('File: ', f)
                # I think you want the header of the dataframe to have columns for Time and Channel A and you want to skip reading some other rows... 
                temp_df = pd.read_csv(f, header=1, skiprows=[0, 2, 3])
                display(temp_df)

编辑 在此之后,我假设 temp_df 看起来像这样:

     Time  Channel A
0    ##    ##
1    ##    ##
2    ##    ##

如果要添加文件标识,可以像这样向数据框添加多索引...

temp_df = pd.concat({f:temp_df})

# output:
                           Time  Channel A
anti_clockwise_01     0    ##    ##
                      1    ##    ##
                      2    ##    ##

然后您应该能够将所有内容连接到一个数据框中。我认为这将产生一个具有 2 个索引(文件名和行号)和 2 个列(时间和通道 A)的数据框。

df = pd.concat([df, temp_df], axis=1)

【讨论】:

  • 这会将所有文件连接成 2 行。创建 5507348 列数据。不幸的是,这不是我想要的。如果您查看问题以及格式图片,我希望每个文件数据都可以通过其标签进行识别。一行是时间,然后是下面的每个文件的电压读数,最后是结果目标(文件保存在的文件夹)。
猜你喜欢
  • 2010-12-06
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2017-08-14
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多