【问题标题】:Compare two classes with range of Marks比较具有分数范围的两个班级
【发布时间】:2020-04-30 12:18:42
【问题描述】:

我有一个包含两个类(A 或 B)和标记的数据框,我想显示每个类的标记范围。

数据框:

Class Mark  Department       
A     74.0  1 
A     73.0  2   
B     72.0  1
A     75.0  1
B     64.0  2

我想要达到的目标:

Class Mark Range        
A     73.0-75.0        
B     64.0-72.0 

我正在考虑使用 min max(为范围创建一个新字段)。但作为开始,我尝试将其分组:

df['count'] = 1
result = df.pivot_table('count', index='Mark', columns='Class', aggfunc='sum').fillna(0)

这很复杂,我很快就放弃了。

然后我只在我的数据框中保留了两列(Mark 和 Class)并使用了以下内容:

df[['Mark','Class']].values

现在我只需要创建标记范围列。我在想是否有一种更简单的方法,无需简单地旋转数据并检查范围(按 ColumnB 分组的 columnA 的最小值)。

【问题讨论】:

  • df.groupby('Class').Mark.agg(['min','max'])?
  • 唯一缺少的是范围 concat,您知道如何很好地做到这一点吗?

标签: python-3.x pandas group-by


【解决方案1】:

简单但丑陋:

temp = df.groupby('Class')['Mark'].agg({'min': min, 'max': max})
temp['range'] = temp['min'].map(str) + '-' + temp['max'].map(str)

temp[['range']]的结果:

           range
Class           
A      73.0-75.0
B      64.0-72.0

【讨论】:

    【解决方案2】:

    我们可以使用GroupBy.apply 并获取每个组的maxmin 并用f-strings 将它们表示为字符串:

    df = (
        df.groupby('Class')['Mark'].apply(lambda x: f'{x.min()}-{x.max()}')
          .reset_index(name='Mark Range')
    )
    
      Class Mark Range
    0  A     73.0-75.0
    1  B     64.0-72.0
    

    【讨论】:

    • 我非常喜欢这个,使用 f-strings 的好主意
    • 这很方便,特别是如果我想添加更多维度(例如部门)。 df.groupby(['Class','Department'])['Mark'].apply(lambda x: f'{x.min()}-{x.max()}') .reset_index(name='MarkRange')
    【解决方案3】:

    如果您有兴趣使用pivot_table

    df_new = (df.pivot_table('Mark', 'Class', aggfunc=lambda x: f'{x.min()}-{x.max()}')
                .add_suffix(' Range').reset_index())
    
    Out[1543]:
      Class Mark Range
    0     A  73.0-75.0
    1     B  64.0-72.0
    

    正如您的评论。要添加Deparment,只需将['Class', 'Department'] 列表用于index,如下所示

    df_new = (df.pivot_table('Mark', ['Class', 'Department'], 
                              aggfunc=lambda x: f'{x.min()}-{x.max()}')
                .add_suffix(' Range').reset_index())
    
    Out[259]:
      Class  Department Mark Range
    0     A           1  74.0-75.0
    1     A           2  73.0-73.0
    2     B           1  72.0-72.0
    3     B           2  64.0-64.0
    

    【讨论】:

    • 这适用于一维。但是如果我想添加“部门”,我有点挣扎
    • @ApoloRadomer:IIUC,加Department不难。我编辑了答案以添加它。检查更新
    • 是的。我这样做了。我不得不重新运行 Jupyter,它成功了。
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多