汇总数据表并导出

介绍pandas模块用于数据表分类汇总和导出。

读取TIFF文件和ROI记录

这里介绍使用 AICSImage 和 roifile 来读取从 ImageJ 中保存的 TIFF 高维图像和 ROI 记录。 读取TIFF图像文件,之前我常用的是 scikit image 中提供的方法: 读取的数据其实就是一个 np.array,可以使用 numpy 这个强大的库进行各种矩阵计算,...

文章收集ROI内的像素值

如果想收集图像ROI中所有像素值且无需保留矩阵结构,可以使用以下函数。 ROI记录通常包含的是ROI轮廓线条的锚点的坐标,我们实际上想获得是这个ROI区域内的所有像素的值。这里使用了 scikit image 中的 draw.polygon 函数,这个函数输入锚点坐标后,会返回该区域内所有位置的索引...

承接上文,我们对每个数据的计算中间结果都存放到一个字典中,再把多个数据 item 放到一个列表 box 中。接下来就需要收集我们所有的计算结果,整合到一个数据表(dataframe),以便汇总分析。具体代码如下:

data = []
for item in box:
print(item['img_fp'], len(item['values']))
df = pd.DataFrame()
df['intensity'] = item['values']
df['img_id'] = item['img_id']
df['group'] = item['group']
df['cell'] = item['cell']
data.append(df)
data = pd.concat(data, ignore_index=True)
# 保存中间数据,以备不时之需
with open('data3.pkl', 'wb') as f:
pickle.dump(data, f)

这里就是一个循环遍历,访问每个数据 item,从中提取出我们想要的信息,然后写入一个 dataframe。

需要注意的是,由于 item['values'] 是数值,而 group 还有 cell 这些都是字符串类型。而且长度还不一致。所以这里创建了一个空白 dataframe (变量名为 df)之后,首选填充 item['values'] ,这个 dataframe 的长度就和 values 一致,然后再赋值其它的非数值列,会自动补齐长度。但是这个 dataframe 中的 values 列已经发生了类型转化,从数值变为了文本,后面也是需要注意的。

每个数据 item 都会得到一个 dataframe,然后我们使用一个列表把它们收集起来,遍历结束后使用 pd.concat 方法将这些 dataframe 合并成一张数据表就行。

简单计算信噪比

信噪比是评估一个新的成像探针或者成像方法的重要指标之一。 最近看到一篇文章 ^1 ,用到一种比较直观简单的信噪比估计方式。其基本思路是: 1. 选取信号区域和背景区域ROI若干 2. 假定信号区域的信号强度实际是真实强度与背景噪声强度的叠加,记作 SIG+BACK 3. 然后将信号区域的 SIG+B...

接下来我们要计算每种细胞的信噪比,就会变得很方便。如下所示:

gps = data.groupby('cell')
pig = []
for cell, df in gps:
print(cell, '======')
gp1 = df.groupby("group")
a = gp1.get_group('u1')
b = gp1.get_group('ctrl')
res = calculateSNR(a, b)
pig.append(res)

这段代码中,先按dataframe 中 cell 列进行分组,然后对每种 cell 进行遍历,此时得到的是每个 cell 下所有的数据,然后进一步按 group分组,得到信号和背景的数据,进而计算信噪比,其结果使用列表收集起来(请忽视示例中随性的列表命名)。

但是这个pig 列表收到的到都是一个个的字典,还需要进一步整合成我们习惯看的表格。这个可以通过下方代码实现:

# 整理到一个summary的表格
pig2 = [pd.Series(x) for x in pig]
pig3 = pd.concat(pig2, axis=1)
pig3.columns = ['7701', 'hpeg2', 'mhcc97']
pig3.to_excel("SNR_summary.xlsx")

这里首先使用 pd.Series 方法将字典转换下对象,原先的字典的 keys 会变为 pd.Series 的 index。再然后我们继续使用 pd.concat 方法把所有的 pd.Series 合并,注意 pd.concat 默认方向是纵向(axis=0, add row),这里的合并方向是横向(axis=1, add column)。合并之后,注意给 column 命名。这个汇总的结果可以保存为 excel 方便查看。

Pasted-image-20240906122756.png-e64a319074.png

如果要对中间数据做一些直方图,可能要需要保存每个细胞不同条件下的数据表,则可以通过以下代码:

import pickle
import pandas as pd
with open('data3.pkl', 'rb') as f:
data = pickle.load(f)
gps = data.groupby('cell')
for cell, df in gps:
gp1 = df.groupby("group")
for group, df1 in gp1:
gp2 = df1.groupby("img_id")
for pid, df2 in gp2:
df2.to_csv(f'{cell}_{group}_{pid}.csv', index=None)