【问题标题】:Double Group-by then apply some functions?Double Group-by 那么应用一些功能呢?
【发布时间】:2016-11-30 13:50:05
【问题描述】:

我的数据如下所示:

 country    source
0   UK       Ads
1   US       Seo
2   US       Seo
3   China    Seo
4   US       Seo
5   US       Seo
6   China    Seo
7   US       Ads

对于每个国家,我想获得每个来源的比率。我对国家和来源进行了分组,得到了下表,其中包含每个国家/地区每个来源的总计数,但不知道如何从这里开始。

df.groupby(['country', 'source']).size() 

country  source
China    Ads       21561
         Direct    17463
         Seo       37578
Germany  Ads        3760
         Direct     2864
         Seo        6432
UK       Ads       13518
         Direct    11131
         Seo       23801
US       Ads       49901
         Direct    40962
         Seo       87229

我正在寻找这样的东西:

      Ads   SEO  Direct 

US    .3     .1   .4    
China .5     .3   .2
UK    .5     .3   .6

【问题讨论】:

    标签: python pandas group-by aggregate-functions


    【解决方案1】:

    您可以使用unstack将结果从长格式转换为宽格式,然后使用apply方法逐行计算比率:

    import pandas as pd
    df1 = df.groupby(['country', 'source']).size().unstack(level=1,fill_value = 0).apply(lambda r: r/r.sum(), axis = 1)
    
    df1
    # source      Ads   Seo
    #country        
    #  China      0.0   1.0
    #     UK      1.0   0.0
    #     US      0.2   0.8
    

    【讨论】:

      【解决方案2】:

      您可以使用pd.crosstab 执行频率计数,然后使用apply 进行归一化:

      df = pd.crosstab(df['country'], df['source']).apply(lambda r: r/r.sum(), axis=1)
      

      【讨论】:

        【解决方案3】:

        大样本集

        np.random.seed([3,1415])
        n = 100000
        df = pd.DataFrame(
            dict(country=np.random.choice(('UK', 'US', 'China'), n),
                 source=np.random.choice(('Ads', 'Seo', 'Direct'), n)))
        

        解决方案

        size = df.groupby(['country', 'source']).size().unstack()
        size.div(size.sum(1), axis=0)
        


        时间

        使用此帖子中的数据

        【讨论】:

        • 看起来你沿着错误的轴潜水,因为列加到 1,但行不完全。很难用样本数据来判断,因为它分布得如此均匀,但可以尝试使用 source=np.random.choice(('Ads', 'Seo', 'Direct'), n, p=(0.1, 0.1, 0.8))) 之类的东西,并将计数与百分比进行比较。
        • @root 你是绝对正确的。谢谢。我修好了。
        猜你喜欢
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 2020-10-17
        • 2021-08-17
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 2020-08-30
        相关资源
        最近更新 更多