【问题标题】:Pandas groupby operations熊猫 groupby 操作
【发布时间】:2018-03-26 23:37:15
【问题描述】:

有一定的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 求和并取 Avg 的平均值。

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) 但我有两个问题:

我不想将 abc.. 与 ijk 和 xyz 组合在一起

我想根据字段名称分别控制总和和平均值

有什么想法吗?非常感谢!

【问题讨论】:

    标签: pandas group-by


    【解决方案1】:

    您需要按列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(['开始', df['结束'].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
    

    【讨论】:

    • 感谢您的帮助。在这种情况下如何重置所有索引?它只是df.reset_index吗?因为我需要将它与原始 df 连接起来
    • 是的,reset_index 最适合重置索引
    • 你能再检查一下吗?它在这里工作正常。我刚刚更新了答案
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2020-10-12
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2018-05-16
    相关资源
    最近更新 更多