Double Group-by然后应用一些功能?

时间:2016-07-26 19:01:52

标签: python pandas group-by aggregate-functions

我的数据如下:

 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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用pd.crosstab执行频率统计,然后apply进行规范化:

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

答案 2 :(得分:1)

大样本集

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)

enter image description here

时序

使用此帖子中的数据

enter image description here

相关问题