熊猫:在每组中创建偏离均值的列

DataFrame在 Python 中考虑以下内容:


import pandas as pd

df = pd.DataFrame({'id':[0]*3+[1]*3,'y':np.random.randn(6),'x':np.random.randn(6)})

这使


   id         y         x

0   0  0.721757  1.595646

1   0  0.359601  1.128473

2   0  1.134922  2.317929

3   1  0.290152 -1.901336

4   1  0.128742  0.982683

5   1  0.556914  0.745208

请注意,y和x是根据 分组的id。我想创建以下内容DataFrame


   id         y         x      y_md      x_md

0   0  0.721757  1.595646 -0.017003 -0.085037

1   0  0.359601  1.128473 -0.379159 -0.552209

2   0  1.134922  2.317929  0.396162  0.637246

3   1  0.290152 -1.901336 -0.035117 -1.843521

4   1  0.128742  0.982683 -0.196527  1.040498

5   1  0.556914  0.745208  0.231644  0.803023

在哪里


y_md包含与其组均值 ( id= 0& 1)的偏差值

x_md包含与其组均值 ( id= 0& 1)的偏差值

我想到的是


df_g = df.groupby('id')

yy = pd.Series( df['y'].values - df_g['y'].mean().repeat(3).values )

xx = pd.Series( df['x'].values - df_g['x'].mean().repeat(3).values )

pd.concat([df,yy.rename('y_md'), xx.rename('x_md')],axis=1)

但它看起来不太好。我想知道是否有一个优雅的 one liner 或类似的结果相同?我将不胜感激你的帮助。


www说
浏览 130回答 2
2回答

一只萌萌小番薯

用于GroupBy.transform处理多列,减去 by DataFrame.sub,更改列名 byDataFrame.add_suffix并附加到原始 by DataFrame.join:c = ['x','y']df = df.join(df[c].sub(df.groupby('id')[c].transform('mean')).add_suffix('_md'))print (df)   id         y         x      x_md      y_md0   0  0.721757  1.595646 -0.085037 -0.0170031   0  0.359601  1.128473 -0.552210 -0.3791592   0  1.134922  2.317929  0.637246  0.3961623   1  0.290152 -1.901336 -1.843521 -0.0351174   1  0.128742  0.982683  1.040498 -0.1965275   1  0.556914  0.745208  0.803023  0.231645或者可以分配新的列名:df[['x_md','y_md']] = df[['x','y']].sub(df.groupby('id')[['x','y']].transform('mean'))

慕码人8056858

设置id为索引,按索引分组并从 df 中减去分组的平均值:df = df.set_index("id")df[['y_md','x_md']] = df.sub(df.groupby("id").agg("mean"))df       y           x            y_md      x_mdid              0   0.721757    1.595646    -0.017003   -0.0850370   0.359601    1.128473    -0.379159   -0.5522100   1.134922    2.317929    0.396162    0.6372461   0.290152    -1.901336   -0.035117   -1.8435211   0.128742    0.982683    -0.196527   1.0404981   0.556914    0.745208    0.231645    0.803023
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python