繁体   English   中英

如何在 Pandas 中平均多索引行

[英]How to average multiindex row in Pandas

目标是平均多索引行的第一级。

例如,任务是平均行 (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'])

我认为你的意思是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

您已将元组用作 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

您还可以像预期的那样使用groupby ,现在您已经有了合适的 MultiIndex:

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

我希望有帮助

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()
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      

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM