【问题标题】:Text file import and how to manipulate select rows and columns into different arrays and do calculations文本文件导入以及如何将选择的行和列操作到不同的数组中并进行计算
【发布时间】:2019-08-14 12:52:26
【问题描述】:

我在 ipython 方面的经验有限,我在研究实验室工作。我们运行一个实验,在完成获取结果后输出一个 .txt 文件。到目前为止,由于 .txt 文件的格式,我们需要先复制并粘贴到 Excel 工作表中,然后进行一系列烦人的复制和粘贴,以便按照我们想要的顺序获得不同的行。

我们需要的唯一重要的列是“well”列和“Abs”列。我需要找到一种方法,以便我可以识别 Abs 编号及其相关的井标识。最终目标是让我编写一个脚本来执行一些超级简单的数学运算,例如平均井 H01 和 H02,以便我可以从其余井中减去该数字。

这可能令人困惑,但如果您对除了阅读文件之外的其他地方有任何问题或想法(这是我现在所能做的),请告诉我。您的帮助将不胜感激!

Text file produced by machine

我尝试过的代码(不是很多)

未来进口部门 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt 从 scipy.optimize 导入曲线拟合 %matplotlib 内联

data = np.loadtxt('python test file.txt',skiprows= 3, usecols=(1,7), dtype= str, unpack=True) 打印(数据)

这是打印出来的……

[[“b'A01'”“b'B01'”“b'C01'”“b'D01'”“b'E01'”“b'F01'”“b'G01'”“b' H01'" “b'H02'” “b'G02'” “b'F02'” “b'E02'” “b'D02'” “b'C02'” “b'B02'” “b'A02'” "b'A03'" "b'B03'" "b'C03'" "b'D03'" "b'D04'" "b'C04'" "b'B04'" "b'A04'"] [“b'6'”“b'6'”“b'5.3501'”“b'6'”“b'6'”“b'6'”“b'3.59128'”“b'0.177349'” “b'0.174828'” “b'3.42995'” “b'6'” “b'5.37723'” “b'5.39004'” “b'5.54484'” “b'6'” “b'6'” “b'5.35271'” “b'3.78453'” “b'5.41057'” “b'6'” “b'6'” "b'5.3402'" "b'3.04992'" "b'6'"]]

【问题讨论】:

  • 您的文件看起来像制表符分隔的 csv。我建议您使用 pandas read_csv 函数将文件作为 DataFrame 读取。代码看起来像```pd.read_csv(file_path, sep="\t", skiprows=2)。它 pandas DataFrame 还将支持其他操作,如平均、求和等。如果您可以将文件的一些初始部分粘贴到问题中会更容易

标签: numpy jupyter-notebook


【解决方案1】:

我不确定我是否能够完全理解您的问题。首先,当您读取文件时,您指定每个元素都是一个字符串 (dtype=str)。但是,您有一列字符串和一列浮点数。然后,您还使用了参数unpack=True,这意味着numpy 将输出多个数组,但您只收集data。如果不清楚,别担心,下面的例子会更清楚。

另一件事是,在 Python 中,默认情况下对字符串使用 unicode,这就是为什么您会在正在读取的值前面看到 b 的原因。

要导入所需的列,您可以执行以下操作:

well, absorption = np.loadtxt('file.txt', 
                              skiprows=3, 
                              usecols=(1,7), 
                              dtype={
                                  'names': ('Well', 'Abs'), 
                                  'formats': ('U3', 'f4')}, 
                              unpack=True)

在上面的命令中,注意你如何指定formats。例如,f4 表示您将获取一个小数点后 4 位的浮点数。如果您将其更改为f2,您将获得更少的小数等。请注意您需要的内容。与U3 相同,这意味着您正在抓取 3 个 unicode 字符,但您可能需要不同的东西。

现在,您想要处理您的数据。首先,您需要找到H01和H02对应的数据线。您可以执行以下操作:

blanks_indexes = np.where(np.logical_or(well=='H01', well=='H02'))

如果你想计算平均值:

abs_blanks = np.mean(absorption[blanks_indexes])

简单地说:

corrected_abs = absorption - abs_blanks

我认为这可以帮助您入门。根据您来自哪里,您可以查看Pandas,这是一个很好的工具,可以处理您所拥有的表格数据,但您必须学习它,因此由您决定是否投资时间与否。

【讨论】:

  • 这对我很有帮助,让我有了一个良好的开端,我一定能完成很多工作。只是几个问题。当我使用您编写的代码行读取文件时,它会在显示 unpack=True 的位置向我抛出语法错误,我不知道如何解决它。
  • 另外看看你将空白定义为blanks_indexes的方式,我是否能够定义任何样本(如在两个并排的井中,所以我们可以重复进行,即井 A03 和 A04 是sample sample) 像这样在一个数组中并对其进行操作?例如从样品中的两个孔中减去空白平均值(A03-空白,A04-空白)。有机会请告诉我!
  • 缺少},但现在已修复。关于第二个问题,我没有完全理解,很可能不适合 Stack Overflow。我建议尝试询问:forum.pythonforthelab.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 2019-04-29
  • 2021-02-26
相关资源
最近更新 更多