Pandas groupby运营

时间:2018-03-26 23:37:15

标签: pandas group-by

有一定的df:

Start  End   N   Count  Avg 
1      abc1  10    2    .5
1      abc2  10    2    .5
1      xyz1  10    2    .5
1      xyz2  10    2    .5  
1      ijk1  10    2    .5
2      abc1  12    3    .4
2      xyz1  12    1    .1
2      xyz2  12    1    .4
2      ijk1  12    6    .5 
2      ijk2  12    1    .7

我的目标是将所有xyz ...分组为1组,将ijk分组为1组。然后将Count计算并取平均值。

Start  End   N   Count  Avg 
1      abc1  10    2    .5
1      abc2  10    2    .5
1      xyz   10    4    .5
1      ijk   10    2    .5
2      abc1  12    3    .4
2      xyz   12    2    .25
2      ijk   12    7    .6

我试过df.groupby()。agg(sum)但我遇到了2个问题:

我不想将abc分组..只是ijk和xyz的任何内容

我想分别控制总和和平均值取决于字段的名称

有什么想法?非常感谢!

1 个答案:

答案 0 :(得分:2)

您需要将列End的字符串部分分组并使用agg

df[df['End'].str.contains('ijk|xyz')]\
.groupby(['Start', df['End'].str.extract('([A-Za-z]+)', expand = False)])\
.agg({'Count': 'sum', 'Avg': 'mean'})

             Count  Avg
Start   End     
1       ijk  2      0.50
        xyz  4      0.50
2       ijk  7      0.60
        xyz  2      0.25

注意:如果只有一个需要排除的数字,您可以简化代码以从End列中提取字符串。像,

df[df['End'].str.contains('ijk|xyz')]\
.groupby(['Start', df['End'].str[:-1]])\
.agg({'Count': 'sum', 'Avg': 'mean'})

重置索引

df[df['End'].str.contains('ijk|xyz')]\

.groupby(['Start',df ['End']。str [: - 1]])\ .agg({'Count':'sum','Avg':'mean'})。reset_index()

    Start   End Count   Avg
0   1       ijk 2   0.50
1   1       xyz 4   0.50
2   2       ijk 7   0.60
3   2       xyz 2   0.25