【问题标题】:Pandas: Create dataframe of rows where the median of a groupby object column is above a threshold熊猫:创建分组对象列的中位数高于阈值的行的数据框
【发布时间】:2016-04-13 22:48:25
【问题描述】:

我有一个包含 gene_namesample_namevaluee_id 列的数据框。我想创建一个数据框,其中只包含gene_name 中所有sample_name 的中位数value 高于阈值的行。

例如如果我有以下数据框:

 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()

但我无法从这里继续。谢谢!

编辑:澄清一下,基因中的所有样本的值都必须超过阈值

【问题讨论】:

  • 试试这个df1 = df.groupby(['gene_name','sample_name']).median().reset_index()然后df1[df1.value > 22],如果这会得到你想要的结果,请告诉我。
  • @Abbas,这仍然不考虑基因中的所有样本都高于阈值,但这是一个开始,谢谢

标签: python pandas


【解决方案1】:

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)]

【讨论】:

    【解决方案2】:

    尝试使用过滤器:

    threshold = 22
    df.groupby(["gene_name", "sample_name"]).filter(lambda x: x['value'].median() > threshold)
    

    【讨论】:

    • 谢谢,但这并不要求 所有 个样本的中位数高于阈值。我已经更新了我的问题以澄清
    猜你喜欢
    • 2018-11-19
    • 2020-12-20
    • 2018-07-19
    • 2020-04-30
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2013-07-30
    相关资源
    最近更新 更多