数据框按特定列分组,其他列的倍数比率?

时间:2018-07-01 15:43:58

标签: python pandas

我有一个数据列,其列为:YearMin 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 个答案:

答案 0 :(得分:2)

首先,我认为unique在这里不是一个好主意。因为如果需要将功能输出分配给年份,则不可能。

如果需要DataFrame的新列而不是聚合的DataFrame,那么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