【发布时间】:2021-02-24 14:14:03
【问题描述】:
我的数据是这种格式,目前我不想更改源数据文件。我无法使用transform, apply 计算总数的百分比。参考这两个link1 和link2,我开始意识到第一个链接可能无法按预期工作。
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