在熊猫中,如何将groupby聚合的结果分配给原始df中的下一个组?

时间:2020-06-27 07:22:24

标签: python pandas

使用大熊猫,我喜欢使用groupby和聚合函数,例如意思 然后将结果放回原始数据框中,但放回 next 组中,而不是组本身中。如何以向量化的方式做到这一点?

我有一个这样的熊猫数据框:

data = {'Group': ['A','A','B','B','B','B', 'C','C', 'D','D'],
        'Value': [1.1,1.3,9.1,9.2,9.5,9.4,6.2,6.4,2.2,2.3]
        }

df = pd.DataFrame(data, columns = ['Group','Value'])

print (df)

  Group  Value
0     A    1.1
1     A    1.3
2     B    9.1
3     B    9.2
4     B    9.5
5     B    9.4
6     C    6.2
7     C    6.4
8     D    2.2
9     D    2.3

我喜欢这样,每组的平均值是前一组的平均值。

  Group  Value
0     A    NaN
1     A    NaN
2     B    1.2
3     B    1.2
4     B    1.2
5     B    1.2
6     C    9.3
7     C    9.3
8     D    6.3
9     D    6.3

我尝试了这个,但这并没有转移到下一个小组

df.groupby('Group')['Value'].transform('mean')

2 个答案:

答案 0 :(得分:6)

容易,对分组结果使用map

df['Value'] = df['Group'].map(df.groupby('Group')['Value'].mean().shift()) 
df
  Group  Value
0     A    NaN
1     A    NaN
2     B    1.2
3     B    1.2
4     B    1.2
5     B    1.2
6     C    9.3
7     C    9.3
8     D    6.3
9     D    6.3

工作原理

求平均值

df.groupby('Group')['Value'].mean()

Group
A    1.20
B    9.30
C    6.30
D    2.25
Name: Value, dtype: float64

下移1

df.groupby('Group')['Value'].mean().shift() 

Group
A    NaN
B    1.2
C    9.3
D    6.3
Name: Value, dtype: float64

将其重新映射。

df['Group'].map(df.groupby('Group')['Value'].mean().shift())  

0    NaN
1    NaN
2    1.2
3    1.2
4    1.2
5    1.2
6    9.3
7    9.3
8    6.3
9    6.3
Name: Group, dtype: float64

答案 1 :(得分:3)

您可以计算每个组值的总计GroupBy.mean,并使用pd.Series.shift并利用熊猫索引对齐。

df.set_index('Group').assign(value = df.groupby('Group').mean().shift()).reset_index()

  Group  Value  value
0     A    1.1    NaN
1     A    1.3    NaN
2     B    9.1    1.2
3     B    9.2    1.2
4     B    9.5    1.2
5     B    9.4    1.2
6     C    6.2    9.3
7     C    6.4    9.3
8     D    2.2    6.3
9     D    2.3    6.3