[英]Reading data from ~150+ (.csv) files into two categories based on the presence of a particular string in the file name
我正在尝试建立一种在Python 3中自动执行大量数据分析的方法。到目前为止,大多数实际分析都非常简单(根据4个输入文件绘制2条曲线并进行一些计算)。 由于我将始终至少有4个文件,因此我目前有类似的东西可以读取我正在查看的4个文件中.csv文件中的所有数据。 实际上,任何给定时间都有大约150多个文件,我需要一种非常快速地比较所有文件的方法。
对于某些背景:
1)。 所有文件都将位于具有相同路径的相同文件夹中(特定文件名除外)。 2)。 有两个类别(我称它们为“控件”和“ NP”),每个类别都有2个与之对应的文件:控件A,控件B和NP-A和NP-B。 3)。 当前在文件名中有大量信息(实验室条件等,数据采集软件正在测量过程中实时读取信息),但是文件名中间的位置是“ Dark”(暗)或“ Dark”(暗) “发光”。
有了这些信息,我试图找到一种方法,一次导入所有文件,然后根据文件名将它们分开。 例如,所有包含单词“ ControlDark”的文件将被分组在一起,所有包含“ ControlIlluminated”的文件将被分组在一起,对于其他两个组合(“ NPDark”和“ NPIlluminated”)依此类推。
现在,我所拥有的只是一个GUI,它允许我从特定路径中手动选择4个文件(使用askopenfilename())。 我不知道一次读取数百个.csv文件的任何好方法。
现在,我一次只能容纳4个数据集,因为我不知道一种保存整个文件夹中有价值数据的方法(没有对应的askopenfilename()或np.genfromtxt('path \\ filename.csv') )
f1 = askopenfilename()
f1_data = pd.read_csv(f1, names = ['A', 'B', 'C'])
f2 = askopenfilename()
f2_data = pd.read_csv(f2, names = ['A', 'B', 'C'])
f3 = askopenfilename()
f3_data = pd.read_csv(f3, names = ['A', 'B', 'C'])
f4 = askopenfilename()
f4_data = pd.read_csv(f4, names = ['A', 'B', 'C'])
基本上,我用askopenfilename()命令调出一个gui并手动找到有问题的4个文件。 但是,我想使它自动化,以便可以从一开始就将所有约150多个文件转储到此文件中。
我已经找到一种开始的方法,但是在将每个文件读入其自己的数据结构中时遇到了一些麻烦。 到目前为止,我有:
import glob
import pandas as pd
import os
path = r'full\path\here'
all_files = glob.glob(os.path.join(path, "*.csv"))
#Setting up a list for each of the 4 files I need to generate each plot
DarkControl = []
IllControl = []
DarkNP = []
IllNP = []
for f in all_files:
if "Control" in f and "Dark" in f:
DarkControl.append(f)
elif "Control" in f and "Illuminated" in f:
IllControl.append(f)
elif "GoldNP" in f and "Dark" in f:
DarkNP.append(f)
elif "GoldNP" in f and "Illuminated" in f:
IllNP.append(f)
因此,我为每个类别都有一个列表,但是现在它是一个字符串列表。 是否有一种很好的方法(可能使用熊猫数据框架?)为all_files中的每个文件f创建数据框架? 我绝对要避免为所有文件创建一个庞大的结构。 在每个文件中,第一列是我的x变量,第二列是我的y变量。 我想确保可以针对x值绘制任何给定f的y值和其他f的y值(所有文件的所有x值都相同)
通常,我们会要求提供一个MVC示例,以用来测试我们的代码。 但是,我认为我确实对您的问题有所了解。
如果我正确理解了您的问题,则您具有传感器类型的数据,其中x是某种类型的类似时间的轴,并且会在多个实验试验中重复进行。
您正在按照正确的顺序整理文件,但是python列表理解可能是一种更干净/更pythonic的编写方式
Dark_control=[f for f in all_files if "Control" in all_files if "Dark" in all_files]
您还可以在glob.glob
实现模式匹配。
数据框对于这种类型的结构是完美的,根据您的数据结构(以及您希望的设置方式),您也可以使用相同的列表理解来读取数据。
Dark_control=[pd.read_csv(f) for f in all_files if "Control" in all_files if "Dark" in all_files]
上面的代码将创建一个包含所有值的数据帧数组,您可以将pd.concat
或pd.join
取决于最终数据的方式。
不确定为什么不能在一个大型数据框中将所有数据汇总在一起进行分析(请考虑使用多索引将不同的实验分开进行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.