通过添加观察值来减少数据帧的行数
我有许多显微镜幻灯片的实验数据。对于每张幻灯片,我都拍摄了许多照片图像,每张图片上都有一些样本。我想知道节目很多标本,我为每个幻灯片:通过添加观察值来减少数据帧的行数
如:幻灯片0,我有四个标本总(三个图像1,一个图像2):
from pandas import DataFrame, Series
import seaborn as sns
data = {'Slide' : [0,0,0,0,0,0,0,0,0, 0,0,0, 9,9,],
'Image' : [1,1,1,1,1,1,1,1,1, 2,2,2, 1,7],
'Specimen' : [1,1,1,1,2,2,3,3,3, 1,1,1, 1,1],
'Foci' : [8,9,7,9,6,9,7,9,6, 6,7,6, 9,6]}
df = DataFrame(data, columns=['Slide','Image','Specimen','Foci'])
df
我可以得到一部分的方式来回答,但这并不完全是我所需要的,因为我还需要加起来样本数为每张幻灯片:
df.groupby(['Slide','Image']).max()
的GROUPBY功能允许您基本上是“支点”的结果就像你在Excel会:
df = df.groupby(['Slide','Image']).Specimen.nunique()
的.nunique()函数会给你每幅图像每张幻灯片的唯一值的数量。然后,您可以在此系列中使用.reset_index()将其转换回数据框。
df.reset_index(inplace=True)
df
Slide Image Specimen
0 0 1 3
1 0 2 1
2 9 1 1
3 9 7 1
如果你再想要滑找到值的简单相加,你可以使用一个最终GROUPBY:
df = df.groupby('Slide').sum()['Specimen']
df
Slide
0 4
9 2
你可以得到.nunique()
Specimen
每个.groupby(['Slide', 'Image')
像这样:
uniques = df.groupby(['Slide', 'Image'])['Specimen'].nunique()
然后你就可以.sum()
每张幻灯片:
uniques.groupby(level='Slide').sum()
获得:
Slide
0 4
9 2
我看到我的OP不是很清楚,对不起!在原始数据框中,样本值是指样本标识符,而不是样本数量。因此,slide0 image1有三个样本(样本1,2和3),而幻灯片0 image2有一个样本(在数据框中标识为样本1)。因此,对于slide0,我希望自动获取“4”的值,参考Slide0中所有拍摄的图像的总数。我希望这能澄清这个问题?! – thescoop
差不多有!那么我将如何总结每张幻灯片的样本数量,以给出答案,slide0有四个样本,幻灯片9有两个样本? – thescoop
刚刚编辑以包含最后一位。 @thescoop –