我有一个数据列,其列为: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]
如何获取数据框而不是数组?
答案 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