2016-06-26 1 views
1

Я хочу сгруппировать набор данных с помощью «assay», а затем сравнить интенсивности для небольших ячеек по сравнению с большими ячейками. Проблема заключается в том, что при написании кода я понимаю, как группировать верхний и нижний кванты квантов целой области данных, а не для каждого отдельного анализа ('wt' и 'cnt').По группам, данные по самым высоким квантилям по сюжету по сравнению с самыми низкими и фиксировать статистику

В качестве конечной точки, хотелось бы, чтобы сравнить средние значения между интенсивностями двух групп для каждого типа анализа ...

from pandas import Series, DataFrame 
import pandas as pd 
import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 

df = DataFrame({'assay':['cnt']*10+['wt']*10, 
       'image':['001']*10+['002']*5+['001']*5, 
       'roi':['1']*5+['2']*5+['3']*5+['1']*5, 
       'cellArea':[99,90,50,2,30,65,95,30,56,5,33,18,98,76,56,72,12,5,47,89], 
       'intensity':[88,34,1,50,2,67,88,77,73,3,2,67,37,34,12,45,23,82,12,1]}, 
       columns=['assay','image','roi','cellArea','intensity']) 

df.loc[(df['cellArea'] < df['cellArea'].quantile(.20)),'group'] = 'Small_CellArea' 
df.loc[(df['cellArea'] > df['cellArea'].quantile(.80)),'group'] = 'Large_CellArea' 
df = df.reset_index(drop=True) 

sns.violinplot(data=df,y='intensity',x='assay',hue='group',capsize=1,ci=95,palette="Set3",inner='quartile',split=True, cut=0) 
plt.ylim(-20,105) 
plt.legend(loc='center', bbox_to_anchor=(0.5, 0.08), ncol=3, frameon=True, fancybox=True, shadow=True, fontsize=12) 

enter image description here

enter image description here

ответ

1

Вычислить низкий и высокий квантиль по группам, а затем объединить их обратно в исходный кадр данных, откуда вы можете вычислить переменную group как Small или large:

from pandas import pd 
quantileLow = df.groupby('assay').cellArea.quantile(0.2).reset_index() 
quantileHigh = df.groupby('assay').cellArea.quantile(0.8).reset_index() 
df = pd.merge(df, pd.merge(quantileLow, quantileHigh, on = "assay"), on = "assay") 

df.loc[df['cellArea'] < df.cellArea_x,'group'] = 'Small_CellArea' 
df.loc[df['cellArea'] > df.cellArea_y,'group'] = 'Large_CellArea' 
Смежные вопросы