Pandas计算与固定项目相比的相对差异

2024-06-02 17:09:05 发布

您现在位置:Python中文网/ 问答频道 /正文

熊猫在这里是初学者,所以如果这个问题不合理,请道歉。 我的数据是4个季度的数据,每个季度每个销售人员的销售价值是:

QTR Name    QTR_Sales   Sales_YTD   Rel_Diff
Q1  Anna    3002        3002        -171
Q2  Anna    3532        6534        -358
Q3  Anna    4487        11021       -506
Q4  Anna    3454        14475       259
Q1  Dave    3173        3173        0
Q2  Dave    3890        7063        0
Q3  Dave    4993        12056       0
Q4  Dave    3195        *15251*     0
Q1  Helen   2429        2429        -744
Q2  Helen   2235        4664        -1655
Q3  Helen   4615        9279        -378
Q4  Helen   3258        12537       63
Q1  Jim     3339        3339        166
Q2  Jim     3082        6421        -808
Q3  Jim     3156        9577        -1837
Q4  Jim     2382        11959       -813

我需要计算每个季度(第Rel_Diff)的相对差异,即“赢家”(全年最高销售额,即Dave)和其他人之间的相对差异。每个人每季度都会被推荐给戴夫。在

我在Excel中完成了这项工作,找到“赢家”并将其存储在it cellI1。。。在

^{pr2}$

…然后把一切都提到“赢家”:

=QTR_Sales-INDEX(QTR_Sales;MATCH(QTR&$I$1;QTR&Name;0))

(我甚至不会把所有的东西都放在一个公式里:)

This post显示hot to do几乎类似,但没有季度要求,并且参考值总是数据帧中的第一个,这在我的任务中不是这样。在

如何使用pandas来完成此操作?在


Tags: 数据namerelhelensales季度daveanna
2条回答

我们可以通过按Name进行分组,并对每个分组的QTR_Sales求和来确定赢家:

winner = df.groupby(['Name'])['QTR_Sales'].sum().argmax()
# Dave

或者,可以通过查找带有 Sales_YTD的最大值:

^{pr2}$

接下来,我们可以选择子数据帧,其中的行对应于获胜者:

df_winner = df.loc[df['Name']==winner, ['QTR', 'QTR_Sales']]
#   QTR  QTR_Sales
# 4  Q1       3173
# 5  Q2       3890
# 6  Q3       4993
# 7  Q4       3195

现在只在df列上合并df子数据帧。 这可能是大部分魔术发生的地方,因为现在每一行都包含原始的QTR_Sales和获胜者的{}(在QTR_Sales_max列中的值):

df = pd.merge(df, df_winner, on=['QTR'], suffixes=['', '_max'])
#      Name QTR  QTR_Sales  Rel_Diff Sales_YTD  QTR_Sales_max
# 0    Anna  Q1       3002      -171      3002           3173
# 1    Dave  Q1       3173         0      3173           3173
# 2   Helen  Q1       2429      -744      2429           3173
# 3     Jim  Q1       3339       166      3339           3173
# 4    Anna  Q2       3532      -358      6534           3890
# 5    Dave  Q2       3890         0      7063           3890
# 6   Helen  Q2       2235     -1655      4664           3890
# 7     Jim  Q2       3082      -808      6421           3890
# 8    Anna  Q3       4487      -506     11021           4993
# 9    Dave  Q3       4993         0     12056           4993
# 10  Helen  Q3       4615      -378      9279           4993
# 11    Jim  Q3       3156     -1837      9577           4993
# 12   Anna  Q4       3454       259     14475           3195
# 13   Dave  Q4       3195         0   *15251*           3195
# 14  Helen  Q4       3258        63     12537           3195
# 15    Jim  Q4       2382      -813     11959           3195

计算Rel_Diff现在很容易:

df['Rel_Diff'] = df['QTR_Sales'] - df['QTR_Sales_max']

import pandas as pd
df = pd.DataFrame({'Name': ['Anna', 'Anna', 'Anna', 'Anna', 'Dave', 'Dave', 'Dave', 'Dave', 'Helen', 'Helen', 'Helen', 'Helen', 'Jim', 'Jim', 'Jim', 'Jim'], 'QTR': ['Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2', 'Q3', 'Q4'], 'QTR_Sales': [3002, 3532, 4487, 3454, 3173, 3890, 4993, 3195, 2429, 2235, 4615, 3258, 3339, 3082, 3156, 2382], 'Rel_Diff': [-171, -358, -506, 259, 0, 0, 0, 0, -744, -1655, -378, 63, 166, -808, -1837, -813], 'Sales_YTD': [3002, 6534, 11021, 14475, 3173, 7063, 12056, 15251, 2429, 4664, 9279, 12537, 3339, 6421, 9577, 11959]})

winner = df.groupby(['Name'])['QTR_Sales'].sum().argmax()
df_winner = df.loc[df['Name']==winner, ['QTR', 'QTR_Sales']]
df = pd.merge(df, df_winner, on=['QTR'], suffixes=['', '_max'])

df['Rel_Diff'] = df['QTR_Sales'] - df['QTR_Sales_max']
df = df.drop(['QTR_Sales_max'], axis=1)

收益率

     Name QTR  QTR_Sales  Rel_Diff Sales_YTD
0    Anna  Q1       3002      -171      3002
1    Dave  Q1       3173         0      3173
2   Helen  Q1       2429      -744      2429
3     Jim  Q1       3339       166      3339
4    Anna  Q2       3532      -358      6534
5    Dave  Q2       3890         0      7063
6   Helen  Q2       2235     -1655      4664
7     Jim  Q2       3082      -808      6421
8    Anna  Q3       4487      -506     11021
9    Dave  Q3       4993         0     12056
10  Helen  Q3       4615      -378      9279
11    Jim  Q3       3156     -1837      9577
12   Anna  Q4       3454       259     14475
13   Dave  Q4       3195         0   *15251*
14  Helen  Q4       3258        63     12537
15    Jim  Q4       2382      -813     11959

您可以使用DataFrame.eval()函数合并属于“winner”的行的子集,并计算“Rel\u Diff2”:

In [133]: (df.merge(df.loc[df.Name.eq(df.loc[df.Sales_YTD.idxmax(), 'Name']), ['QTR', 'QTR_Sales']],
     ...:           on='QTR',
     ...:           suffixes=['','2'])
     ...:    .eval("Rel_Diff2 = QTR_Sales - QTR_Sales2", inplace=False)
     ...:    .drop('QTR_Sales2', 1)
     ...: )
Out[133]:
   QTR   Name  QTR_Sales  Sales_YTD  Rel_Diff  Rel_Diff2
0   Q1   Anna       3002       3002      -171       -171
1   Q1   Dave       3173       3173         0          0
2   Q1  Helen       2429       2429      -744       -744
3   Q1    Jim       3339       3339       166        166
4   Q2   Anna       3532       6534      -358       -358
5   Q2   Dave       3890       7063         0          0
6   Q2  Helen       2235       4664     -1655      -1655
7   Q2    Jim       3082       6421      -808       -808
8   Q3   Anna       4487      11021      -506       -506
9   Q3   Dave       4993      12056         0          0
10  Q3  Helen       4615       9279      -378       -378
11  Q3    Jim       3156       9577     -1837      -1837
12  Q4   Anna       3454      14475       259        259
13  Q4   Dave       3195      15251         0          0
14  Q4  Helen       3258      12537        63         63
15  Q4    Jim       2382      11959      -813       -813

相关问题 更多 >