如何在其他几个列上添加一个权重列?

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

【讨论】:

以上是关于如何在其他几个列上添加一个权重列?的主要内容,如果未能解决你的问题,请参考以下文章

尝试为其他几个列的完整地址创建一个列,但在某些地址上遇到问题

如何在一个列上对 sql server 进行透视,但重命名为动态列

Delphi 的DBGridEH 中,几个列栏位值相加

Oracle 复合索引--转载

c#怎么在dataGridView里面添加一列?

c#怎么在dataGridView里面添加一列?