我的数据如下:
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
答案 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)