我有一个包含gene_name
,sample_name
,value
和e_id
列的数据框。我想创建一个数据框,其中只包含value
中所有sample_name
的中位数gene_name
高于阈值的行。
E.g。如果我有以下数据框:
e_id gene_name sample_name value
1 gene1 sample1 10
2 gene1 sample1 21
3 gene1 sample1 31
4 gene2 sample1 40
5 gene2 sample1 50
6 gene2 sample1 60
2 gene1 sample2 11
3 gene1 sample2 22
1 gene1 sample2 32
5 gene2 sample2 41
6 gene2 sample2 51
4 gene2 sample2 61
3 gene1 sample3 12
1 gene1 sample3 23
2 gene1 sample3 33
6 gene2 sample3 42
4 gene2 sample3 52
5 gene2 sample3 62
1 gene1 sample4 13
2 gene1 sample4 24
3 gene1 sample4 34
4 gene2 sample4 43
5 gene2 sample4 53
6 gene2 sample4 63
中位数是:
gene_name sample_name
gene1 sample1 21
sample2 22
sample3 23
sample4 24
gene2 sample1 50
sample2 51
sample3 52
sample4 53
阈值22应该产生一个只包含gene2
条目的数据帧,因为并非gene1
中的所有样本都有22以上的中位数。结果应如下所示:
e_id gene_name sample_name value
4 gene2 sample1 40
5 gene2 sample1 50
6 gene2 sample1 60
5 gene2 sample2 41
6 gene2 sample2 51
4 gene2 sample2 61
6 gene2 sample3 42
4 gene2 sample3 52
5 gene2 sample3 62
4 gene2 sample4 43
5 gene2 sample4 53
6 gene2 sample4 63
我找到了使用groupby
的中位数:
df.groupby(["gene_name", "sample_name"])["value"].median()
但是我无法从这里开始。谢谢!
编辑:为了澄清,基因中的所有样本必须具有超过阈值的值
答案 0 :(得分:2)
让cond
成为一个布尔数据框,显示哪些中位数高于阈值:
cond = df.groupby(["gene_name", "sample_name"])["value"].median() >= 22
我们可以再次groupby
找出哪些基因的中位数都高于阈值:
cond.groupby(level=0).all()
输出:
gene_name
gene1 False
gene2 True
dtype: bool
您可以使用它来过滤原始数据帧。第一步是提取填充条件的基因名称列表。可以有更优雅的方式,但我用过这个:
s = cond.groupby(level=0).all()
gene_list = s[s.values].index.tolist()
现在可以轻松过滤原始数据框:
df[df.gene_name.isin(gene_list)]
答案 1 :(得分:0)
尝试使用过滤器:
threshold = 22
df.groupby(["gene_name", "sample_name"]).filter(lambda x: x['value'].median() > threshold)