从Groupby创建新的Pandas列并划分其他列

时间:2019-12-23 23:06:22

标签: python pandas

我有一个数据框df,例如:

    Name     Date Item  Quantity  Unit_Cost  Value
0   Alex  2018_Q1   AA         9       8.97  80.73
1   Alex  2018_Q1   BB         3      12.34  37.02
2   Alex  2018_Q1   CC         4       1.40   5.60
3   Alex  2018_Q1   DD         7       0.22   1.54
4    Ray  2018_Q1   AA         8       5.30  42.40
5    Ray  2018_Q1   DD         2       1.60   3.20
6    Ray  2018_Q1   EE         4       8.00  32.00
7    Ray  2018_Q1   FF         9       4.00  36.00
8   Alex  2018_Q2   DD         1       0.45   0.45
9   Alex  2018_Q2   AA         4       7.00  28.00
10  Alex  2018_Q2   EE         2       6.40  12.80
11  Alex  2018_Q2   CC         3       2.30   6.90
12   Ray  2018_Q2   CC         1       9.00   9.00
13   Ray  2018_Q2   DD         4       8.00  32.00
14   Ray  2018_Q2   GG         1       6.50   6.50
15   Ray  2018_Q2   HH         2       9.10  18.20

nd我想计算一个称为% of Total Value的新列,该列将是:

(给定Value DateName的{​​Item)/(sum ValuesDate }和Name)。

所以输出看起来像:

    Name     Date Item  Quantity  Unit_Cost  Value  % of Total Value
0   Alex  2018_Q1   AA         9       8.97  80.73          0.646409
1   Alex  2018_Q1   BB         3      12.34  37.02          0.296421
2   Alex  2018_Q1   CC         4       1.40   5.60          0.044839
3   Alex  2018_Q1   DD         7       0.22   1.54          0.012331
4    Ray  2018_Q1   AA         8       5.30  42.40          0.373239
5    Ray  2018_Q1   DD         2       1.60   3.20          0.028169
6    Ray  2018_Q1   EE         4       8.00  32.00          0.281690
7    Ray  2018_Q1   FF         9       4.00  36.00          0.316901
8   Alex  2018_Q2   DD         1       0.45   0.45          0.009346
9   Alex  2018_Q2   AA         4       7.00  28.00          0.581516
10  Alex  2018_Q2   EE         2       6.40  12.80          0.265836
11  Alex  2018_Q2   CC         3       2.30   6.90          0.143302
12   Ray  2018_Q2   CC         1       9.00   9.00          0.136986
13   Ray  2018_Q2   DD         4       8.00  32.00          0.487062
14   Ray  2018_Q2   GG         1       6.50   6.50          0.098935
15   Ray  2018_Q2   HH         2       9.10  18.20          0.277017

我尝试过类似的事情:

quarter_total_value = df.groupby(['Name', 'Date'])['Value'].sum()

df['% of Total Value'] = df['Value']/quarter_total_value

但这给了我一个错误:

ValueError: cannot join with no overlapping index names

那么我如何获得所需的输出?我是否必须遍历df并编写每个% of Total Value还是有更简单的方法呢?

1 个答案:

答案 0 :(得分:2)

您可以使用transform

进行检查
quarter_total_value = df.groupby(['Name', 'Date'])['Value'].transform('sum')

df['% of Total Value'] = df['Value']/quarter_total_value