【问题标题】:Percent of total with repeated products重复产品占总数的百分比
【发布时间】:2021-02-24 14:14:03
【问题描述】:

我的数据是这种格式,目前我不想更改源数据文件。我无法使用transform, apply 计算总数的百分比。参考这两个link1link2,我开始意识到第一个链接可能无法按预期工作。

df_list = [['USA MARKET', 'APPLE', 'QUARTER', '2020-06-01', 100], ['USA MARKET', 'APPLE', 'YEARLY', '2020-06-01', 1000],
           ['USA MARKET', 'PEAR', 'QUARTER', '2020-06-01', 200],  ['USA MARKET', 'PEAR', 'YEARLY', '2020-06-01', 5000], 
           ['USA MARKET', 'APPLE', 'QUARTER', '2020-03-01', 300],  ['USA MARKET', 'APPLE', 'YEARLY', '2020-03-01', 2000],
           ['USA MARKET', 'PEAR', 'QUARTER', '2020-03-01', 700],  ['USA MARKET', 'PEAR', 'YEARLY', '2020-03-01', 8000], 
           ['UK MARKET', 'WATERMELON', 'QUARTER', '2020-06-01', 100], ['UK MARKET', 'WATERMELON', 'YEARLY', '2020-06-01', 1000],
           ['UK MARKET', 'WATERMELON', 'QUARTER', '2020-06-01', 200],  ['UK MARKET', 'WATERMELON', 'YEARLY', '2020-06-01', 5000], 
           ['UK MARKET', 'GRAPE', 'QUARTER', '2020-06-01', 200],    ['UK MARKET', 'GRAPE', 'YEARLY', '2020-06-01', 5000],
           ['UK MARKET', 'WATERMELON', 'QUARTER', '2020-03-01', 300],  ['UK MARKET', 'WATERMELON', 'YEARLY', '2020-03-01', 2000],
           ['UK MARKET', 'WATERMELON', 'QUARTER', '2020-03-01', 700],  ['UK MARKET', 'WATERMELON', 'YEARLY', '2020-03-01', 8000],
           ['UK MARKET', 'GRAPE', 'QUARTER', '2020-03-01', 200],  ['UK MARKET', 'GRAPE', 'YEARLY', '2020-03-01', 5000]]

column_names = ['MARKET', 'PRODUCT', 'TIMEPERIOD', 'DATE', 'VALUES']
df = pd.DataFrame(df_list, columns = column_names)

def market_share(x):
    try:
        ms = x / float(x.sum())
    except ZeroDivisionError:
        ms = 0
    
    return ms
    

df['MS'] = (df.groupby(['MARKET', 'TIMEPERIOD', 'DATE'])['VALUES']
                                        .transform(market_share))

上面的输出是:

    MARKET     PRODUCT       TIMEPERIOD    DATE         VALUES   MS
0   USA MARKET  APPLE        QUARTER       2020-06-01   100     0.333333
1   USA MARKET  APPLE        YEARLY        2020-06-01   1000    0.166667
2   USA MARKET  PEAR         QUARTER       2020-06-01   200     0.666667
3   USA MARKET  PEAR         YEARLY        2020-06-01   5000    0.833333
4   USA MARKET  APPLE        QUARTER       2020-03-01   300     0.300000
5   USA MARKET  APPLE        YEARLY        2020-03-01   2000    0.200000
6   USA MARKET  PEAR         QUARTER       2020-03-01   700     0.700000
7   USA MARKET  PEAR         YEARLY        2020-03-01   8000    0.800000
8   UK MARKET   WATERMELON   QUARTER       2020-06-01   100     0.200000
9   UK MARKET   WATERMELON   YEARLY        2020-06-01   1000    0.090909
10  UK MARKET   WATERMELON   QUARTER       2020-06-01   200     0.400000
11  UK MARKET   WATERMELON   YEARLY        2020-06-01   5000    0.454545
12  UK MARKET   GRAPE        QUARTER       2020-06-01   200     0.400000
13  UK MARKET   GRAPE        YEARLY        2020-06-01   5000    0.454545
14  UK MARKET   WATERMELON   QUARTER       2020-03-01   300     0.250000
15  UK MARKET   WATERMELON   YEARLY        2020-03-01   2000    0.133333
16  UK MARKET   WATERMELON   QUARTER       2020-03-01   700     0.583333
17  UK MARKET   WATERMELON   YEARLY        2020-03-01   8000    0.533333
18  UK MARKET   GRAPE        QUARTER       2020-03-01   200     0.166667
19  UK MARKET   GRAPE        YEARLY        2020-03-01   5000    0.333333

现在,这本身并没有错,因为如果你想计算 2020-06-01 季度英国市场的西瓜总量百分比,你可以使用 0.2+0.4=0.6,但我希望这样我可以将市场份额(占总数的百分比)直接设为 0.6,而不是分别为 0.2 和 0.4 让我加起来。

UK MARKET   WATERMELON   QUARTER       2020-06-01   300  0.6

这个问题可以使用我发布的第二个链接来解决,但我想知道我在这里做错了什么没有正确获得聚合。

【问题讨论】:

  • 你调试过这个吗?
  • 不,我无法使用我粘贴的代码进行调试。但是可以使用第二个链接中的方式来完成。但是我更倾向于知道如何使用我上面显示的方法来解决它。

标签: python pandas dataframe group-by aggregation-framework


【解决方案1】:

这些数据在我看来是正确的。

您正在按 3 个索引进行分组:['MARKET', 'TIMEPERIOD', 'DATE']

请记住,您不是在 PRODUCT 上进行分组

UK MARKET   WATERMELON   QUARTER       2020-06-01   300  0.6

相应的分组条目应该是:

8   UK MARKET   WATERMELON   QUARTER       2020-06-01   100     0.200000
10  UK MARKET   WATERMELON   QUARTER       2020-06-01   200     0.400000
12  UK MARKET   GRAPE        QUARTER       2020-06-01   200     0.400000

所以这些值对我来说是正确的。

【讨论】:

  • 是的,这些值确实是正确的。但问题是西瓜在英国市场上出现过两次。我希望它们在最终结果中仅占 0.6 的市场份额。我单独显示的结果显示了西瓜的市场份额 - 当我希望它们作为一个实体显示时。
  • 对于西瓜的汇总结果,您也可以在PRODUCT 上进行分组。我错过了什么?
  • 如果那样做,就会忽略英国市场的GRAPE,现在西瓜分别有0.33和0.66,这是错误的
猜你喜欢
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多