【问题标题】:Pandas: How to add yearly average to dataframe?Pandas:如何将年平均值添加到数据框中?
【发布时间】:2016-03-04 16:22:39
【问题描述】:
year  x             y
1987  1.609438      0
1988  1.386294      0
1989  1.098612      1
1987  0.693147      0
1988  0.000000      0
1989 -0.693147      1

...

所以,我可以得到 x 的平均值

>>> df.groupby(['year'])['x','y'].mean()
   x     y
year     meanX     meanY                    
1987     0.597434  0.000000
1988     0.428441  0.351852
1989     0.155169  0.185185

如何添加将每一行与年份相关联的新列?我的意思是我想要这样的东西:

year  x             y   meanX   meanY
1987  1.609438      0   0.597434  0.000000
1988  1.386294      0   0.428441  0.351852
1989  1.098612      1   0.155169  0.185185
1987  0.693147      0   0.597434  0.000000
1988  0.000000      0   0.428441  0.351852
1989 -0.693147      1   0.155169  0.185185

这样做的正确方法是什么?

【问题讨论】:

  • 我不明白你是如何得到 'meanY' 的输出,但你是在 In [196]: df df[['meanx','meany']] = df.groupby('year')[['x','y']].transform('mean') df Out[196]: year x y meanx meany 0 1987 1.609438 0 1.151293 0 1 1988 1.386294 0 0.693147 0 2 1989 1.098612 1 0.202733 1 3 1987 0.693147 0 1.151293 0 4 1988 0.000000 0 0.693147 0 5 1989 -0.693147 1 0.202733 1 之后吗?
  • 我的意思是我只展示了数据库的一部分。注意“...”。这是你的问题吗?对不起!谢谢!

标签: python pandas


【解决方案1】:
df['x_mean'] = df.groupby('year').x.transform(lambda s: s.mean())
df['y_mean'] = df.groupby('year').y.transform(lambda s: s.mean())

>>> df
   year         x  y    x_mean  y_mean
0  1987  1.609438  0  1.151293       0
1  1988  1.386294  0  0.693147       0
2  1989  1.098612  1  0.202733       1
3  1987  0.693147  0  1.151293       0
4  1988  0.000000  0  0.693147       0
5  1989 -0.693147  1  0.202733       1

【讨论】:

    【解决方案2】:

    pandas.DataFrame.merge 应该做你想做的事:

    data =  [
      {'year': 1987, 'x': 1.5116, 'y': 0},
      {'year': 1988, 'x': 1.135, 'y': 1}
    ]
    means = df.groupby(['year'])['x', 'y'].mean()
    df.merge(right=means, left_on='year', right_index=True, suffixes=('', 'mean'))
    

    返回:

            x  y  year   xmean  ymean
    0  1.5116  0  1987  1.5116      0
    1  1.1350  1  1988  1.1350      1
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2015-01-13
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      相关资源
      最近更新 更多