使用groupby计算复制中的平均值

2024-04-18 21:14:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()得到每个实验的基因计数:

^{pr2}$

产生如下输出:

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

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

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

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


Tags: 数据value基因事件形式计数experimentna
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

拿着你的桌子,再做一次分组:

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

您将得到一个额外的无意义列,它是复制数的平均值,但您可以将其丢弃。在

相关问题 更多 >