潘达斯:在每组中创建与平均数有偏差的列。

问题描述 投票:0回答:1

请考虑以下几点 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

请注意 yx 归类为 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)

但我觉得不好看。我不知道是否有一个优雅的一字型或类似的效果?我将感谢您的帮助。

python pandas dataframe pandas-groupby
1个回答
1
投票

使用 GroupBy.transform 处理多列时,用 DataFrame.sub,通过以下方式更改列名 DataFrame.add_suffix 补足 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_md
0   0  0.721757  1.595646 -0.085037 -0.017003
1   0  0.359601  1.128473 -0.552210 -0.379159
2   0  1.134922  2.317929  0.637246  0.396162
3   1  0.290152 -1.901336 -1.843521 -0.035117
4   1  0.128742  0.982683  1.040498 -0.196527
5   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'))

1
投票

设置 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_md
id              
0   0.721757    1.595646    -0.017003   -0.085037
0   0.359601    1.128473    -0.379159   -0.552210
0   1.134922    2.317929    0.396162    0.637246
1   0.290152    -1.901336   -0.035117   -1.843521
1   0.128742    0.982683    -0.196527   1.040498
1   0.556914    0.745208    0.231645    0.803023
© www.soinside.com 2019 - 2024. All rights reserved.