Pandas:创建行的数据帧,其中groupby对象列的中位数高于阈值

时间:2016-04-13 13:48:58

标签: python pandas

我有一个包含gene_namesample_namevaluee_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()

但是我无法从这里开始。谢谢!

编辑:为了澄清,基因中的所有样本必须具有超过阈值的值

2 个答案:

答案 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)