如何在Pandas中平均多索引行

luaexgnf  于 2022-12-25  发布在  其他
关注(0)|答案(4)|浏览(136)

目的是对多索引行的第一个级别求平均值。
例如,任务是对行(s1,s2)和(s1,s3)求平均。
给定以下df

a  fe  gg new_text
(s1, s2)  4   0   3        t
(s1, s3)  3   3   1        t
(s2, s3)  3   2   4        t
(s2, s4)  0   0   4        t
(s3, s1)  2   1   0        t
(s3, s4)  1   1   0        t

预期输出如下所示

a  fe  gg new_text
s1  7   3   4 t      
s2  3   2   8 t      
s3  3   3   0 t

我尝试使用以下语法

df.groupby(level=0).agg(['mean'])

产生了不期望的输出

a   fe   gg
         mean mean mean
(s1, s2)  4.0  0.0  3.0
(s1, s3)  3.0  3.0  1.0
(s2, s3)  3.0  2.0  4.0
(s2, s4)  0.0  0.0  4.0
(s3, s1)  2.0  1.0  0.0
(s3, s4)  1.0  1.0  0.0

我想知道如何解决这个问题。
可以使用以下代码重现输出

import pandas as pd
import numpy as np
np.random.seed(0)

arr=np.random.randint(5, size=(6, 3))

df = pd.DataFrame(data=arr, index=[('s1','s2'),('s1','s3'),('s2','s3'),('s2','s4'),('s3','s1'),('s3','s4')],
                  columns=['a','fe','gg'])
df['new_text']='t'
df2=df.groupby(level=0).agg(['mean'])
jucafojl

jucafojl1#

我想你是说sum而不是mean

agg_dict = {'a':'sum', 'fe':'sum', 'gg':'sum', 'new_text':'first'}
out = df.groupby([m[0] for m in df.index]).agg(agg_dict)
print(out)

    a  fe  gg new_text
s                     
s1  7   3   4        t
s2  3   2   8        t
s3  3   2   0        t
mec1mxoz

mec1mxoz2#

我希望这能帮上忙

a=df.index.values.tolist() #get value index 
l=[]
for i in range(len(df)):
    l.append(str(a[i]).split("'")[1])

df['new_id']=l
df.groupby("new_id")['a','fe','gg'].sum()
hs1ihplo

hs1ihplo3#

您已经使用元组作为DataFrame索引中的项,但尚未使用MultiIndex
如果使用MultiIndex,则可以使用xs()选择要计算平均值的条目子集:

df.index = pd.MultiIndex.from_arrays([[c[0] for c in df.index], [c[1] for c in df.index]])

将索引转换为MultiIndex后,DataFrame现在的打印方式如下所示:

a  fe  gg
s1 s2  4   1   4
   s3  1   1   1
s2 s3  4   2   3
   s4  2   2   4
s3 s1  1   4   3
   s4  2   3   1

现在我们可以挑选出要用于xs()计算的行,在本例中是MultiIndex的第0级中包含's1'的所有行:

df.xs('s1').mean(axis=0)

结果:

a     2.5
fe    1.0
gg    2.5
dtype: float64

现在您已经有了一个合适的MultiIndex,您还可以按照预期使用groupby

df.groupby(level=0).mean()

结果:

a   fe   gg
s1  2.5  1.0  2.5
s2  3.0  2.0  3.5
s3  1.5  3.5  2.0
62lalag4

62lalag44#

df.index = pd.MultiIndex.from_tuples(df.index.tolist())
df.groupby(level=0).agg({'a': 'sum', 'fe': 'sum', 'gg': 'sum', 'new_text': 'first'})

生产

a  fe  gg new_text
s1  7   3   4 t      
s2  3   2   8 t      
s3  3   3   0 t

相关问题