基于索引的一列的平均值和另外2列

时间:2020-08-24 08:34:27

标签: python pandas dataframe pandas-groupby

我有这个数据框:

d = {'day': [0,0,0,0,0,0, 1,1,1,1,1,1, 2,2,2,2,2,2], 'period': ['p1','p1','op1','op1','p2','p2','p1','p1','op1','op1','p2','p2','p1','p1','op1','op1','p2','p2'], 's1':[2,2,3,6,4,2,8,2,1,2,1,2,2,9,5,2,2,3]}  
df = pd.DataFrame(data=d)

enter image description here

我需要这个结果:

enter image description here

我尝试过:

df.groupby('period', as_index=False)['s1'].mean()

这是结果:

enter image description here

但这并不能解决我的问题。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

df.groupby(['period',df.groupby(['day','period']).cumcount()]).mean()

输出:

          day        s1
period                 
op1    0  1.0  3.000000
       1  1.0  3.333333
p1     0  1.0  4.000000
       1  1.0  4.333333
p2     0  1.0  2.333333
       1  1.0  2.333333

答案 1 :(得分:0)

计算一个将第二个值分组的列。然后groupby()

d = {'day': [0,0,0,0,0,0, 1,1,1,1,1,1, 2,2,2,2,2,2], 'period': ['p1','p1','op1','op1','p2','p2','p1','p1','op1','op1','p2','p2','p1','p1','op1','op1','p2','p2'], 's1':[2,2,3,6,4,2,8,2,1,2,1,2,2,9,5,2,2,3]}  
df = pd.DataFrame(data=d)
dfm = df.assign(
    even=lambda dfa: dfa.index%2
).groupby(["period","even"]).mean().reset_index().drop(columns="even")

print(dfm.to_string())

输出

  period  day        s1
0    op1  1.0  3.000000
1    op1  1.0  3.333333
2     p1  1.0  4.000000
3     p1  1.0  4.333333
4     p2  1.0  2.333333
5     p2  1.0  2.333333