[英]Pandas - calculate relative difference compared to a fixed item
熊貓初學者在這里,所以如果這個問題看起來不太樂觀,請您道歉。 我的數據是四個季度,銷售價值是每個季度的每個銷售人員:
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
我需要計算“贏家”(全年最高銷售額,即Dave)與其他所有人之間每個季度的相對差異(列Rel_Diff
)。 每個季度都將引用Dave。
我在Excel中做到了,方法是找到“優勝者”並將其存儲在單元格I1
...
=INDEX(Name;MATCH(MAX(Sales_YTD);Sales_YTD;0))
...然后將所有內容引用給“獲勝者”:
=QTR_Sales-INDEX(QTR_Sales;MATCH(QTR&$I$1;QTR&Name;0))
(我什至不會嘗試將所有內容放在一個公式中:)
這篇文章顯示了熱做幾乎類似的事情,但是沒有季度要求,並且參考值始終是數據框中的第一個,在我的任務中情況並非如此。
如何使用pandas
做到這一點?
我們可以通過對Name
進行分組,然后對每個組的QTR_Sales
求和來確定贏家:
winner = df.groupby(['Name'])['QTR_Sales'].sum().argmax()
# Dave
或者,可以通過找到具有Sales_YTD
最大值的行來找到獲勝者的姓名:
df.loc[df['Sales_YTD'].argmax(), 'Name']
# Dave
接下來,我們可以選擇帶有與獲勝者對應的行的子DataFrame:
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
,通過合並在QTR
僅列。 這可能是大多數魔術發生的QTR_Sales
行,因為現在每一行都包含原始的QTR_Sales
和獲勝者的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()
函數合並屬於“優勝者”的行的子集並計算“ Rel_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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.