【问题标题】:Pandas: use one column for groupby and get stats for multiple other columnsPandas:将一列用于 groupby 并获取多个其他列的统计信息
【发布时间】:2017-09-30 09:07:36
【问题描述】:

我有一个 3 列的数据框,

ID col1 col2 
A1 1 12
A1 3 10
A1 4 16
........
A9 9 18
A9 7 11
A9 8 15

我想创建一个带有列的新数据框:

ID col1_min, col1_max, col2_min, col2_max.

A1 1         4         10        16
...........
A9 7         9         11        18

我可以通过使用 groupby 来做到这一点

col1_min = df.groupby(['ID'])['col1'].min()
col1_max = df.groupby(['ID'])['col1'].max()
col2_min = df.groupby(['ID'])['col2'].min()
col2_max = df.groupby(['ID'])['col2'].max()

df2 = pd.DataFrame({'col1_min':col1_min, 'col1_max':col1_max, 'col2_min':col2_min, 'col2_max':col2_max})

一定有更好更优雅的方式(一个班轮)?

非常感谢。

【问题讨论】:

    标签: pandas group-by


    【解决方案1】:
    df.groupby('ID').agg(['min', 'max'])
    
       col1     col2    
        min max  min max
    ID                  
    A1    1   4   10  16
    A9    7   9   11  18
    

    压平列
    d = df.groupby('ID').agg(['min', 'max'])
    d.columns = d.columns.map('_'.join)
    d
    
        col1_min  col1_max  col2_min  col2_max
    ID                                        
    A1         1         4        10        16
    A9         7         9        11        18
    

    如果你的列标题是数字,你可以使用

    d = df.groupby('ID').agg(['min', 'max'])
    d.columns = d.columns.map('{0[0]}_{0[1]}'.format)
    d
    
        col1_min  col1_max  col2_min  col2_max
    ID                                        
    A1         1         4        10        16
    A9         7         9        11        18
    

    最后,reset_index 在数据框中正确获取索引。

    d = df.groupby('ID').agg(['min', 'max'])
    d.columns = d.columns.map('{0[0]}_{0[1]}'.format)
    d.reset_index()
    
       ID  col1_min  col1_max  col2_min  col2_max
    0  A1         1         4        10        16
    1  A9         7         9        11        18
    

    【讨论】:

      【解决方案2】:

      使用 groupby 和 agg

      df = df.groupby('ID').agg({'col1': ['min', 'max'], 'col2': ['min', 'max']}).reset_index()
      df.columns = df.columns.map('_'.join)min', 'max']})
      
          ID_ col1_min    col1_max    col2_min    col2_max
      0   A1  1           4           10          16
      1   A9  7           9           11          18
      

      【讨论】:

        【解决方案3】:

        我认为 PiR 和 Vai 已经提供了很好的答案,但是如果你想要不同的东西,你可以看看这个......

        from functools import reduce
        df1=df.groupby('ID')['col1','col2'].apply(lambda x: [x.min().values,x.max().values])
        pd.DataFrame(data=[reduce(lambda x,y:  np.append(x,y),l) for l in df1],index=df1.index,columns=np.core.defchararray.add(np.repeat(['col1','col2'], 2),np.tile(['min','max'],2))) 
        
        
        Out[1001]: 
            col1min  col1max  col2min  col2max
        ID                                    
        A1        1       10        4       16
        A9        7       11        9       18
        

        【讨论】:

          猜你喜欢
          • 2020-06-05
          • 2022-11-10
          • 2013-07-14
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 2014-08-03
          • 2021-07-24
          相关资源
          最近更新 更多