Pandas - 将每行除以分组平均值

4

我是一名有帮助的助手,可以为您翻译文本。

我正在尝试解决一个相对简单的问题,但不清楚如何在 pandas 中实现它。

我有一个 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字段左连接dfdfGroup来获取新的大数据框,然后逐列进行一些繁琐的列除法操作,但也许有更简单的方法吗?

1个回答

4
让我们看一下如何在IT技术中使用groupbytransform来实现div功能:
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、transform和div函数:
df[['A','B','C']].div(df.groupby(df.index.floor('D')).transform('mean'))

输出 head() 函数:

                        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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接