【问题标题】:Calculating means in replicates using groupby使用 groupby 计算复制中的平均值
【发布时间】:2013-02-07 06:21:15
【问题描述】:

我有以下形式的实验数据,其中每个实验和处理都重复运行,命中是与特定事件相关的基因:

experiment  treatment   replicate   hit
1   1   1   gene1
1   1   1   gene2
1   1   1   gene1
1   1   1   gene1
1   1   2   gene1
1   1   2   gene1
1   2   1   gene1
1   2   1   gene2
1   2   2   gene2
1   2   2   gene2

我想要做的是计算治疗中每个基因的平均计数。

我可以使用value_counts() 获得每个实验的基因计数:

counts = df['hit'].groupby([df['experiment'], df['treatment'],
                            df['replicate']]
                          ).value_counts().unstack()

产生如下输出:

experiment  treatment   replicate    gene1  gene2
1   1   1   3   1
1   1   2   2   NA
1   2   1   1   1
1   2   2   NA  2

但我真正想要的是每次治疗的平均计数,所以(假设用 0 替换 NA):

experiment  treatment   gene1   gene2
1   1   2.5 0.5
1   2   0.5 1.5

有什么想法吗?将.mean() 应用于 value_counts 似乎可以计算出所有列的平均值,而不是每次重复。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    只要拿下你的桌子,再做一个 groupby:

    >>> g = d.hit.groupby([d.experiment, d.treatment, d.replicate]).value_counts().unstack().reset_index()
    >>> print g
       experiment  treatment  replicate  gene1  gene2
    0           1          1          1      3      1
    1           1          1          2      2    NaN
    2           1          2          1      1      1
    3           1          2          2    NaN      2
    >>> print g.fillna(0).groupby(['experiment', 'treatment']).mean()
                          replicate  gene1  gene2
    experiment treatment                         
    1          1                1.5    2.5    0.5
               2                1.5    0.5    1.5
    

    你得到一个额外的无意义的列,它是重复数的平均值,但你可以把它扔掉。

    【讨论】:

    • 太好了,谢谢!我猜如果复制列使用 A、B 而不是 1,2,那么 mean() 函数会将其视为无效而忽略它,并且您不会得到额外的列。
    【解决方案2】:

    你也可以使用被低估的pd.get_dummies

    In [31]: pd.get_dummies(df.hit)
    Out[31]:
       gene1  gene2
    0      1      0
    1      0      1
    2      1      0
    3      1      0
    4      1      0
    5      1      0
    6      1      0
    7      0      1
    8      0      1
    9      0      1
    
    In [32]: df2 = pd.get_dummies(df.hit).groupby([df.experiment,df.treatment,df.replicate]).sum(); df2
    Out[32]:
                                    gene1  gene2
    experiment treatment replicate
    1          1         1              3      1
                         2              2      0
               2         1              1      1
                         2              0      2
    
    In [34]: df2.groupby(level='treatment').mean()
    Out[34]:
               gene1  gene2
    treatment
    1            2.5    0.5
    2            0.5    1.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多