通过添加观察值来减少数据帧的行

时间:2016-06-14 00:44:28

标签: python pandas group-by

我有许多显微镜载玻片的实验数据。对于每张幻灯片,我拍摄了许多照片,在每张照片上我都有许多标本。我想知道我为每张幻灯片展示了许多标本:

例如:在幻灯片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

enter image description here

我可以找到答案的一部分,但这不是我需要的,因为我仍然需要为每张幻灯片添加样本编号:

df.groupby(['Slide','Image']).max()

enter image description here

2 个答案:

答案 0 :(得分:2)

groupby功能允许您实际上" pivot"结果就像你在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

答案 1 :(得分:1)

您可以为每个Specimen获取.nunique() .groupby(['Slide', 'Image'),如下所示:

uniques = df.groupby(['Slide', 'Image'])['Specimen'].nunique()

然后您可以为每张幻灯片.sum()

uniques.groupby(level='Slide').sum()

得到:

Slide
0    4
9    2