如何在其他几个列上添加一个权重列?
Posted
技术标签:
【中文标题】如何在其他几个列上添加一个权重列?【英文标题】:How can I add a weight column conditional on several other columns? 【发布时间】:2020-10-11 01:37:23 【问题描述】:我有以下名为“生产”的 pandas 数据框,并希望根据其物种、温室和年月获得每种植物产品的重量
plant species greenhouse produce year_month
0001 S1 GH1 200 2020-05
0002 S1 GH1 200 2020-05
0003 S2 GH1 100 2020-05
0004 S2 GH1 50 2020-05
0005 S1 GH2 90 2020-05
0006 S2 GH2 60 2020-05
0007 S1 GH1 150 2020-04
0008 S1 GH2 250 2020-04
0009 S1 GH2 100 2020-04
0010 S2 GH2 150 2020-04
0011 S2 GH2 190 2020-04
0012 S2 GH2 10 2020-04
例如,对于“2020-05”,我们有 GH1 和 GH2。在 GH1 中,S1(工厂 0001 和 0002)的总产量为 400(200 + 200),因此工厂 0001 的重量为 0.50,工厂 0002 的重量为 0.50。 S2 的总产量为 150 (100 + 50);因此,我们将种植 0003 的权重设为 0.66(100 / 150),将种植 0004 的权重设为 0.33(50 / 150)。以此类推。
我想生成这些“条件分组”权重并将它们作为新列分配给数据框,结果如下所示:
plant species greenhouse produce year_month contribution_weight
0001 S1 GH1 200 2020-05 0.50
0002 S1 GH1 200 2020-05 0.50
0003 S2 GH1 100 2020-05 0.66
0004 S2 GH1 50 2020-05 0.33
0005 S1 GH2 90 2020-05 1.00
0006 S2 GH2 60 2020-05 1.00
0007 S1 GH1 150 2020-04 1.00
0008 S1 GH2 250 2020-04 0.71
0009 S1 GH2 100 2020-04 0.29
0010 S2 GH2 150 2020-04 0.42
0011 S2 GH2 190 2020-04 0.54
0012 S2 GH2 10 2020-04 0.02
如何以编程方式添加contribution_weight 列?
我曾尝试使用 pandas 手动计算每个权重,但这非常繁琐,容易出错并生成大量子数据集。这是实时数据,因此下个月将有另一批带有 year_month '2020-06' 的批次,并且还可能有额外的 GH 和物种,所以我正在寻找一个足够通用和抽象的解决方案,即使有额外的标签也可以工作在每一列中。也许某些功能会起作用?
【问题讨论】:
【参考方案1】:我们可以transform
s=df.groupby(['year_month','greenhouse','species']).produce.transform('sum')
df['New']=df.produce/s
df
plant species greenhouse produce year_month New
0 1 S1 GH1 200 2020-05 0.500000
1 2 S1 GH1 200 2020-05 0.500000
2 3 S2 GH1 100 2020-05 0.666667
3 4 S2 GH1 50 2020-05 0.333333
4 5 S1 GH2 90 2020-05 1.000000
5 6 S2 GH2 60 2020-05 1.000000
6 7 S1 GH1 150 2020-04 1.000000
7 8 S1 GH2 250 2020-04 0.714286
8 9 S1 GH2 100 2020-04 0.285714
9 10 S2 GH2 150 2020-04 0.428571
10 11 S2 GH2 190 2020-04 0.542857
11 12 S2 GH2 10 2020-04 0.028571
【讨论】:
以上是关于如何在其他几个列上添加一个权重列?的主要内容,如果未能解决你的问题,请参考以下文章
尝试为其他几个列的完整地址创建一个列,但在某些地址上遇到问题