根据它的标签计算一行的平均值

时间:2017-11-13 04:08:34

标签: pandas pandas-groupby

根据它的标签计算一行中值的平均值:

bool subset_sum(int a[],int n, int sum)
{
 bool dp[n+1][sum+1];


   int i,j;

   for(i=0;i<=n;i++)   
      dp[i][0]=true;

   for(j=1;j<=sum;j++)
        dp[0][j]=false;

   for(i=1;i<=n;i++)

    {

        for(j=1;j<=sum;j++)

       {

           if(dp[i-1][j]==true)

              dp[i][j]=true;

           else
           {

               if(a[i-1]>j)

                   dp[i][j]=false;

                else

                    dp[i][j]=dp[i-1][j-a[i-1]];

            }

        }

    }
  return dp[n][sum];
}

我希望输出为:0-&gt; 3; 1→ 7.8

pandas有groupby功能,但我不知道如何实现它。感谢

3 个答案:

答案 0 :(得分:1)

这很简单groupby问题......

Result=Result.T
Result.groupby(Result[1])[0].mean()
Out[372]: 
1
0    3
1    8
Name: 0, dtype: int64

答案 1 :(得分:0)

首先,听起来你想要标记索引:

In [11]: Result = pd.DataFrame(data=[A, B], index=['A', 'B'])

In [12]: Result
Out[12]:
   0  1  2  3  4  5  6  7  8   9
A  1  2  3  4  5  6  7  8  9  10
B  0  0  0  0  0  1  1  1  1   1

如果索引是唯一的,你不必进行任何分组,只需取每行的平均值(即轴= 1):

In [13]: Result.mean(axis=1)
Out[13]:
A    5.5
B    0.5
dtype: float64

但是,如果您有多个具有相同标签的行,那么您需要分组:

In [21]: Result2 = pd.DataFrame(data=[A, A, B], index=['A', 'A', 'B'])

In [22]: Result2.mean(axis=1)
Out[22]:
A    5.5
A    5.5
B    0.5
dtype: float64

注意:重复的行(碰巧与我懒惰地使用相同的行内容具有相同的意思),通常我们想要采用这些方法的平均值:

In [23]: Result2.mean(axis=1).groupby(level=0).mean()
Out[23]:
A    5.5
B    0.5
dtype: float64

注意:.groupby(level=0)将具有相同索引标签的行分组。

答案 2 :(得分:0)

你通过构建数据框架来使自己变得困难,以便将你想要的东西和你想要成为标签的东西放在不同的行上。

选项1
groubpy
这涉及数据框Result

中提供的数据
Result.loc[0].groupby(Result.loc[1]).mean()

1
0    3
1    8
Name: 0, dtype: int64

选项2
使用np.bincount进行过度杀伤,因为您的分组值为01。我有一个解决方案,即使它们不是,但它使它更简单 我想使用原始列表AB

pd.Series(np.bincount(B, A) / np.bincount(B))

0    3.0
1    8.0
dtype: float64

选项3
构造一个系列而不是数据框 再次使用原始列表AB

pd.Series(A, B).mean(level=0)

0    3
1    8
dtype: int64