2016-06-14 2 views
3

У меня есть экспериментальные данные для нескольких слайдов микроскопа. Для каждого слайда я взял несколько фотографических изображений, и на каждом изображении у меня есть несколько образцов. Я хотел бы знать, показать многие образцы у меня есть для каждого слайда:Сокращение строк кадра данных путем добавления наблюдаемых значений

например: На слайде 0, у меня есть четыре экземпляра в общих (три в изображении 1, один в IMAGE2):

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

Функция GroupBy позволяет существенно «Стержень» результаты, как вы бы в первенствует:

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

Функция .nunique() даст вам количество уникальных значений на одно изображение на слайде. Затем вы можете использовать .reset_index() в этой серии, чтобы преобразовать его обратно в dataframe.

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 
+0

Почти там! Как бы я затем СЛУЧАЛ число образцов для каждого слайда, чтобы дать мне ответ, что slide0 имеет четыре экземпляра, а слайд 9 имеет два экземпляра? – thescoop

+0

Просто отредактирован, чтобы включить этот последний бит. @thescoop –

1

Вы можете получить .nunique()Specimen для каждого .groupby(['Slide', 'Image') так:

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

Тогда вы можете .sum() для каждого слайда:

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

получить:

Slide 
0 4 
9 2 
+0

я вижу, что мой OP не очень понятно, извините! В исходном кадре данных значение Образца относится к идентификатору образца и не является количеством экземпляров. Таким образом, slide0 image1 имеет три образца (образец 1, 2 и 3) и слайд 0 image2 имеет один экземпляр (обозначенный как образец 1 в кадре данных). Таким образом, для slide0 я бы хотел, чтобы автоматический способ получить значение «4» назад, имея в виду количество экземпляров в целом, для всех изображений, сделанных с помощью слайда0. Надеюсь, это прояснит вопрос ?! – thescoop

Смежные вопросы