【问题标题】:Grouping column values together将列值分组在一起
【发布时间】:2018-08-23 16:18:31
【问题描述】:

我有一个这样的数据框:

Class  price  demand
1       22       8
1       60       7
3       32       14
2       72       9
4       45       20
5       42       25

我想做的是将 1-3 班归为一个类别,将 4-5 班归为一个类别。然后我想得到每个类别的价格总和以及每个类别的需求总和。我也想得到平均值。结果应如下所示:

Class   TotalPrice   TotalDemand   AveragePrice  AverageDemand
P          186            38           46.5          9.5   
E          87             45           43.5          22.5

其中 P 是 1-3 级,E 是 4-5 级。如何在熊猫中按类别分组?有没有办法做到这一点?

【问题讨论】:

  • 这听起来像是免费代码编写服务的要求。您能否展示自己为实现目标所做的努力?

标签: python pandas


【解决方案1】:
In [8]: df.groupby(np.where(df['Class'].isin([1, 2, 3]), 'P', 'E'))[['price', 'demand']].agg(['sum', 'mean'])
Out[8]: 
  price       demand      
    sum  mean    sum  mean
E    87  43.5     45  22.5
P   186  46.5     38   9.5

【讨论】:

    【解决方案2】:

    您可以创建一个定义您的组的字典。

    mapping = {**dict.fromkeys([1, 2, 3], 'P'), **dict.fromkeys([4, 5], 'E')}
    

    然后,如果您将字典或可调用对象传递给groupby,它会自动映射到索引上。所以,让我们将索引设置为Class

    d = df.set_index('Class').groupby(mapping).agg(['sum', 'mean']).sort_index(1, 1)
    

    最后,我们进行了一些调整,以按照您指定的方式获取列名。

    rename_dict = {'sum': 'Total', 'mean': 'Average'}
    d.columns = d.columns.map(lambda c: f"{rename_dict[c[1]]}{c[0].title()}")
    
    d.rename_axis('Class').reset_index()
    
      Class  TotalPrice  TotalDemand  AveragePrice  AverageDemand
    0     E          87           45          43.5           22.5
    1     P         186           38          46.5            9.5
    

    【讨论】:

      【解决方案3】:

      一般情况下,您可以使用pd.cut 形成任意 bin 来对数据进行分组,并指定正确的 bin 边缘:

      import pandas as pd
      
      pd.cut(df.Class, bins=[0, 3, 5], labels=['P', 'E'])
      #0    P
      #1    P
      #2    P
      #3    P
      #4    E
      #5    E
      
      df2 = (df.groupby(pd.cut(df.Class, bins=[0,3,5], labels=['P', 'E']))[['demand', 'price']]
               .agg({'sum', 'mean'}).reset_index())
      
      # Get rid of the multi-level columns
      df2.columns = [f'{i}_{j}' if j != '' else f'{i}' for i,j in df2.columns]
      

      输出:

        Class  demand_sum  demand_mean  price_sum  price_mean
      0     P          38          9.5        186        46.5
      1     E          45         22.5         87        43.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多