熊猫:.groupby()。size()和百分比

发布于 2021-01-29 15:58:33

我有一个源自df.groupby().size()操作的DataFrame,看起来像这样:

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定位中总共出现了50次(7 + 13 + 8 + 6 + 8 + 2 + 6),分别产生14%和26%的RNANon- expressedVery lowRNA水平。

有没有很好的方法可以做到这一点?我一直在以一种我认为非常round回的方式进行处理,即为每个对象创建一个新的DataFrameLocalization并从那里开始进行工作,但是存在很多局限性,并且最终必须合并所有生成的DataFrames
。我希望至少有一种更聪明的方法!

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是基于熊猫完整的示例groupbysum函数。基本思想是基于数据对数据进行分组'Localization'并在其上应用功能。

    import pandas as pd
    from io import StringIO
    #For Python 2, replace previous line with: from StringIO 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))
    


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看