Pandas:.groupby().size()和百分比

2024-06-12 07:45:17 发布

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

我有一个源自df.groupby().size()操作的数据帧,如下所示:

Localization                           RNA level      
cytoplasm                              1 Non-expressed     7
                                       2 Very low         13
                                       3 Low               8
                                       4 Medium            6
                                       5 Moderate          8
                                       6 High              2
                                       7 Very high         6
cytoplasm & nucleus                    1 Non-expressed     5
                                       2 Very low          8
                                       3 Low               2
                                       4 Medium           10
                                       5 Moderate         16
                                       6 High              6
                                       7 Very high         5
cytoplasm & nucleus & plasma membrane  1 Non-expressed     6
                                       2 Very low          3
                                       3 Low               3
                                       4 Medium            7
                                       5 Moderate          8
                                       6 High              4
                                       7 Very high         1

我要做的是计算单独的出现次数(即最后一列来自.size())占适用Localization中出现次数总数的百分比。

例如:在cytoplasm定位(7+13+8+6+8+2+6)中共有50次出现,分别产生14%和26%的Non-expressedVery lowRNA水平。

有什么好办法吗?我一直在用一种我认为非常迂回的方式来讨论这个问题,即为每一个Localization创建一个新的数据帧,然后从那里开始工作,但是有很多行,最后必须合并所有生成的数据帧。我希望至少有一个更聪明的方法来做这件事!


Tags: 数据size次数verylowmediumnonhigh
1条回答
网友
1楼 · 发布于 2024-06-12 07:45:17

下面是基于pandas^{}^{}函数的完整示例。 基本思想是基于'Localization'对数据进行分组,并在组上应用函数。

import pandas as pd
from StringIO import StringIO
#For Python 3: from io import StringIO

data = \
"""Localization,RNA level,Size
cytoplasm                            ,1 Non-expressed, 7
cytoplasm                            ,2 Very low     ,13
cytoplasm                            ,3 Low          , 8
cytoplasm                            ,4 Medium       , 6
cytoplasm                            ,5 Moderate     , 8
cytoplasm                            ,6 High         , 2
cytoplasm                            ,7 Very high    , 6
cytoplasm & nucleus                  ,1 Non-expressed, 5
cytoplasm & nucleus                  ,2 Very low     , 8
cytoplasm & nucleus                  ,3 Low          , 2
cytoplasm & nucleus                  ,4 Medium       ,10
cytoplasm & nucleus                  ,5 Moderate     ,16
cytoplasm & nucleus                  ,6 High         , 6
cytoplasm & nucleus                  ,7 Very high    , 5
cytoplasm & nucleus & plasma membrane,1 Non-expressed, 6
cytoplasm & nucleus & plasma membrane,2 Very low     , 3
cytoplasm & nucleus & plasma membrane,3 Low          , 3
cytoplasm & nucleus & plasma membrane,4 Medium       , 7
cytoplasm & nucleus & plasma membrane,5 Moderate     , 8
cytoplasm & nucleus & plasma membrane,6 High         , 4
cytoplasm & nucleus & plasma membrane,7 Very high    , 1"""

# Create the dataframe
df = pd.read_csv(StringIO(data))
df['Localization'].str.strip()
df['RNA level'].str.strip()
df['Size'].astype(int)
df['Percent'] = df.groupby('Localization')['Size'].transform(lambda x: x/sum(x))

相关问题 更多 >