Python | Groupby |枢轴|使用百分比

时间:2017-11-22 13:07:23

标签: python pandas group-by pivot-table

我目前正在使用比率,但遇到了障碍。

以下是我使用[还有Instagram,Messenger等其他平台]的数据的一小部分示例,以提供以下更多背景信息:

Date        Reach   Impressions Clicks  Landing_Page    Platform
30/05/2017  27447   27939       90      68              Facebook
30/05/2017  24299   24318       80      44              Facebook
30/05/2017  9897    10081       33      25              Facebook
30/05/2017  11696   11721       33      21              Facebook
30/05/2017  53      55          1                       Facebook
31/05/2017  46632   68757       213     143             Facebook
31/05/2017  67478   73401       650     424             Facebook
31/05/2017  38831   47577       136     77              Facebook
31/05/2017  46834   52449       135     77              Facebook
31/05/2017  273     531         12      10              Facebook
1/06/2017   48307   72141       221     150             Facebook
1/06/2017   64122   79501       202     106             Facebook
1/06/2017   66810   71033       843     575             Facebook
1/06/2017   46225   50003       138     76              Facebook
1/06/2017   496     1043        16      15              Facebook

然后我创建了一个新列:

df["Click_To_Landing_Ratio] = df["Landing_Page] / df["Clicks"] * 100

我尝试了以下内容:

round(df.pivot_table(index="Date", columns="Platform", values="Click_To_Landing_Ratio"), 3)

round(df.groupby(["Date", "Platform"], axis=0)["Click_To_Landing_Ratio"].mean().unstack(), 3)

当我在excel中透视这个(并创建一个计算列)时,我得到了

Row Labels  Facebook    Grand Total
30/05/2017  66.67%      66.67%
31/05/2017  63.79%      63.79%
1/06/2017   64.93%      64.93%
2/06/2017   63.98%      63.98%

当我在Pandas中进行Pivot或Groupby时,我得到:

Row Labels  Facebook    Grand Total
30/05/2017  53.990%     53.990% 
31/05/2017  65.871%     65.871% 
1/06/2017   67.476%     67.476%
2/06/2017   64.031%     64.031%

我猜测Pandas正在平均当天的行值,因为excel会创建一个总数,并以总条目(如果有意义)潜水。

简而言之,我的问题是:

  1. 如果每个行都有比率(百分比),有没有办法在Excel中复制相同的结果,但是在Pandas中?
  2. 你能否使用类似于Pandas的groupby获得总数(margin = True)?
  3. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

此处您正确识别的问题是,您无意中平均每日点击登陆值,而Excel则通过总结每日点击次数和目标网页访问量以及划分值来计算平均值

您可以在pandas中通过创建pivot_table并对每天的值进行求和来做同样的事情(通知我已经aggfunc='sum'传递给pivot_table)。然后,您可以应用除法来查找平均值:

df
          Date  Reach  Impressions  Clicks  Landing_Page  Platform
0   30/05/2017  27447        27939      90            68  Facebook
1   30/05/2017  24299        24318      80            44  Facebook
2   30/05/2017   9897        10081      33            25  Facebook
3   30/05/2017  11696        11721      33            21  Facebook
4   30/05/2017     53           55       1             0  Facebook
5   31/05/2017  46632        68757     213           143  Facebook
6   31/05/2017  67478        73401     650           424  Facebook
7   31/05/2017  38831        47577     136            77  Facebook
8   31/05/2017  46834        52449     135            77  Facebook
9   31/05/2017    273          531      12            10  Facebook
10   1/06/2017  48307        72141     221           150  Facebook
11   1/06/2017  64122        79501     202           106  Facebook
12   1/06/2017  66810        71033     843           575  Facebook
13   1/06/2017  46225        50003     138            76  Facebook
14   1/06/2017    496         1043      16            15  Facebook

t = df.pivot_table(index="Date", columns="Platform", values=['Clicks', 'Landing_Page'], aggfunc='sum')
             Clicks Landing_Page
Platform   Facebook     Facebook
Date                            
1/06/2017      1420          922
30/05/2017      237          158
31/05/2017     1146          731

t[('Landing_Page', 'Facebook')].div(t[('Clicks', 'Facebook')]).apply(lambda x: '{:.2%}'.format(x))
Date
1/06/2017     64.90%
30/05/2017    66.70%
31/05/2017    63.80%
dtype: object