代码之家  ›  专栏  ›  技术社区  ›  Koray Tugay

按特定列分组的数据帧,其他列的聚合比率?

  •  3
  • Koray Tugay  · 技术社区  · 7 年前

    我有一个带有列的数据框: Year Min Delay .示例行如下:

    2014    0
    2014    2
    2014    0
    2014    4
    2015    4
    2015    4
    2015    2
    2015    2
    

    我想每年对这个数据框架进行分组,并找到 延迟比 每年(即当年非零分录数除以当年分录总数)。因此,如果我们考虑上面的数据框架,我想得到的是:

    2014  0.5
    2015  1
    

    (2014年有2次延期,2015年共有4次延期,共4次。延迟由最小延迟定义>0)

    这就是我所尝试的:

    def find_ratio(df):
        ratio = 1 - (len(df[df == 0]) / len(df))
        return ratio
    
    
    print(df.groupby(["Year"])["Min Delay"].transform(find_ratio).unique())
    

    打印内容: [0.5 1]

    如何获取数据帧而不是数组?

    1 回复  |  直到 7 年前
        1
  •  2
  •   jezrael    7 年前

    首先我想 unique 在这里使用不是个好主意。因为如果需要将函数的输出分配给年份,就不可能了。

    阿尔索 transform 如果需要新的列到数据帧,而不是聚合的数据帧,这是个好主意。


    我认为需要 GroupBy.apply ,还应通过布尔掩码简化函数:

    def find_ratio(df):
        ratio = (df != 0).mean()
        return ratio
    
    print(df.groupby(["Year"])["Min Delay"].apply(find_ratio).reset_index(name='ratio'))
    
       Year  ratio
    0  2014    0.5
    1  2015    1.0
    

    具有lambda函数的解决方案:

    print (df.groupby(["Year"])["Min Delay"]
             .apply(lambda x: (x != 0).mean())
             .reset_index(name='ratio'))
    
       Year  ratio
    0  2014    0.5
    1  2015    1.0
    

    解决方案 GroupBy.transform 返回新列:

    df['ratio'] = df.groupby(["Year"])["Min Delay"].transform(find_ratio)
    print (df)
       Year  Min Delay  ratio
    0  2014          0    0.5
    1  2014          2    0.5
    2  2014          0    0.5
    3  2014          4    0.5
    4  2015          4    0.0
    5  2015          4    0.0
    6  2015          2    0.0
    7  2015          2    0.0