在groupby之后将新列添加到pandas数据帧并在列上滚动

时间:2019-01-18 13:57:50

标签: pandas

我正在尝试在groupby和滚动平均之后向pandas数据帧添加新列,但是新生成的列在reset_index()之后会更改顺序

原始数据框

Name    Values
0   A   1
1   A   2
2   A   3
3   B   1
4   B   2
5   C   3
6   A   2
7   A   6
8   B   8
9   B   3
10  D   0

groupby滚动后看起来像这样:

Name    
A     0          NaN
      1          NaN
      2     2.000000
      6     2.333333
      7     3.666667
B     3          NaN
      4          NaN
      8     3.666667
      9     4.333333
C     5          NaN
D     10         NaN
Name: Values, dtype: float64

现在有人可以帮助我将此结果添加到原始数据框中的新列中吗?因为当我尝试reset_index()时,顺序更改为groupby顺序。

2 个答案:

答案 0 :(得分:2)

使用“应用”对每个组应用滚动平均值,

df['rolling_mean'] = df.groupby('Name').Values.apply(lambda x: x.rolling(3).mean())

    df  

  Name  Values  rolling_mean
0   A   1   NaN
1   A   2   NaN
2   A   3   2.000000
3   B   1   NaN
4   B   2   NaN
5   C   3   NaN
6   A   2   2.333333
7   A   6   3.666667
8   B   8   3.666667
9   B   3   4.333333
10  D   0   NaN

答案 1 :(得分:1)

这里是一个例子:

df = pd.DataFrame({'Name': {0: 'A',
  1: 'A',
  2: 'A',
  3: 'B',
  4: 'B',
  5: 'C',
  6: 'A',
  7: 'A',
  8: 'B',
  9: 'B',
  10: 'D'},
 'Values': {0: 1, 1: 2, 2: 3, 3: 1, 4: 2, 5: 3, 6: 2, 7: 6, 8: 8, 9: 3, 10: 0}})

df2 = pd.DataFrame({2: {('A', 0): np.nan,
  ('A', 1): np.nan,
  ('A', 2): 2.0,
  ('A', 6): 2.333333,
  ('A', 7): 3.666667,
  ('B', 3): np.nan,
  ('B', 4): np.nan,
  ('B', 8): 3.666667,
  ('B', 9): 4.3333330000000005,
  ('C', 5): np.nan,
  ('D', 10): np.nan}})

df.merge(df2.reset_index(level=0), left_index=True, right_index=True)


   Name  Values  0         2
0     A       1  A       NaN
1     A       2  A       NaN
2     A       3  A  2.000000
3     B       1  B       NaN
4     B       2  B       NaN
5     C       3  C       NaN
6     A       2  A  2.333333
7     A       6  A  3.666667
8     B       8  B  3.666667
9     B       3  B  4.333333
10    D       0  D       NaN

join

df.join(df2.reset_index(level=0))

   Name  Values  0         2
0     A       1  A       NaN
1     A       2  A       NaN
2     A       3  A  2.000000
3     B       1  B       NaN
4     B       2  B       NaN
5     C       3  C       NaN
6     A       2  A  2.333333
7     A       6  A  3.666667
8     B       8  B  3.666667
9     B       3  B  4.333333
10    D       0  D       NaN