我正在执行以下操作:
def percentage(x):
return x[(x<=5)].count() / x.count() * 100
full_data = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})
但是我想依次使用groupby
函数中的多个值,例如x<=7
,x<=9
,x<=11
等来执行percentage
。
执行此操作而不是编写多个函数并调用它们的最简单方法是什么?
所以基本上我想避免做这样的事情:
def percentage_1(x):
return x[(x<=5)].count() / x.count() * 100
full_data_1 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage_1})
def percentage_2(x):
return x[(x<=7)].count() / x.count() * 100
full_data_2 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage_2})
# etc.
答案 0 :(得分:2)
您可以重写函数-创建由布尔掩码填充的新列,然后将mean
与100
的最后一个乘以Series.mul
进行汇总:
n = 3
full_data['new'] = full_data['Volume'] <= n
full_data = full_data.groupby(['Id', 'Week_id'])['new'].mean().mul(100).reset_index()
具有功能的解决方案:
def per(df, n):
df['new'] = df['Volume'] <= n
return df.groupby(['Id', 'Week_id'])['new'].mean().mul(100).reset_index()
编辑:来自github的解决方案:
full_data = pd.DataFrame({
'Id':list('XXYYZZXYZX'),
'Volume':[2,4,8,1,2,5,8,2,6,4],
'Week_id':list('aaabbbabac')
})
print (full_data)
val = 5
def per(c):
def f1(x):
return x[(x<=c)].count() / x.count() * 100
return f1
full_data2 = full_data.groupby(['Id', 'Week_id']).agg({'Volume': per(val)}).reset_index()
print (full_data2)
Id Week_id Volume
0 X a 66.666667
1 X c 100.000000
2 Y a 0.000000
3 Y b 100.000000
4 Z a 0.000000
5 Z b 100.000000
def percentage(x):
return x[(x<=val)].count() / x.count() * 100
full_data1 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})
print (full_data1)
Id Week_id Volume
0 X a 66.666667
1 X c 100.000000
2 Y a 0.000000
3 Y b 100.000000
4 Z a 0.000000
5 Z b 100.000000
答案 1 :(得分:1)
我想出了这个作为我问题最简洁的解决方案:
$.each(data, function(key, entry) {
dropdown.append( $('<a class="dropdown-item"></a>')
.attr('value', entry.code).text(entry.name).click(function() {
$(this).closest(".input-group").find("input").val($(this).text())
})
);
但是,我正在使用全局变量,这是一个颇有争议的做法。