[英]Pandas - divide each row by a group average
我正在嘗試解決一個有點簡單的任務,但不清楚如何在熊貓中實現它。
所以我有一個 Pandas 數據框,它有一組我感興趣的列。一組列存儲在factors
列表中:
#get df
df = pd.read_sql(sql=sqlString, con = engine)
#shuffle
df = df.sample(frac=1, random_state=123).reset_index(drop=True)
#list of fields we want
factors = ['GRP_RANK', 'BK_YIELD', 'SALES_YIELD', 'EARNINGS_YIELD_LTM', 'CASHFLOW_YIELD', 'ROE', 'ROIC',
'ROA', 'GROSS_MGN', '12MVT', '1MVT', 'BETA_3Y', 'BETA_1Y', 'P_TOTAL_RETURN(-1,0,USD)']
現在,數據框中有DATE
列。 對於每條記錄的每個factors
,我想將因子的值除以特定日期的因子值的平均值。
我設法按天獲得每個因素的平均值:
dfGroup = df[factors + ["DATE"]].groupby('DATE')[factors].mean()
但我不確定如何繼續。 我想到的唯一一件事是通過按 DATE 字段左加入df
和dfGroup
來獲得新的大數據dfGroup
,然后按列划分做一些 ugle 列,但也許有一種方法可以更輕松地做到這一點?
讓我們看看使用groupby
並使用div
transform
:
MVCE:
df = pd.DataFrame({'Date':pd.date_range('2018-02-10','2018-02-12',freq='H'),'A':np.random.randint(0,100,49),'B':np.random.randint(100,200,49),'C':np.random.random(49)})
df = df.set_index('Date')
print(df.head())
輸出:
A B C
Date
2018-02-10 00:00:00 11 131 0.474226
2018-02-10 01:00:00 35 188 0.998742
2018-02-10 02:00:00 97 182 0.683685
2018-02-10 03:00:00 0 134 0.845094
2018-02-10 04:00:00 24 173 0.238379
使用 groupby、transfrom 和 div:
df[['A','B','C']].div(df.groupby(df.index.floor('D')).transform('mean'))
輸出頭():
A B C
Date
2018-02-10 00:00:00 0.362637 0.866593 0.931739
2018-02-10 01:00:00 1.153846 1.243660 1.962284
2018-02-10 02:00:00 3.197802 1.203969 1.343275
2018-02-10 03:00:00 0.000000 0.886439 1.660404
2018-02-10 04:00:00 0.791209 1.144432 0.468357
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.