我有这样的SQL语句:
select id
, avg(case when rate=1 then rate end) as "P_Rate"
, stddev(case when rate=1 then rate end) as "std P_Rate",
, avg(case when f_rate = 1 then f_rate else 0 end) as "A_Rate"
, stddev(case when f_rate = 1 then f_rate else 0 end) as "std A_Rate"
from (
select id, connected_date,payment_type,acc_type,
max(case when is s_rate > 1 then 1 else 0 end) / count(open) as rate
sum(case when is hire_days <= 5 and paid>1000 then 1 else 0 end )/count(open) as f_rate
from analysis_table where alloc_date <= '2016-01-01' group by 1,2
) a group by id
我试图用熊猫重写:
首先,我将为“内部”表创建数据框:
filtered_data = data.where(data['alloc_date'] <= analysis_date)
然后我将这些数据分组
grouped = filtered_data.groupby(['id','connected_date'])
但是我必须使用它来过滤每列并在其上使用max / sum。
我尝试过这样的事情:
`def my_agg_function(hire_days,paid,open):
r_arr = []
if hire_days <= 5 and paid > 1000:
r_arr.append(1)
else:
r.append(0)
return np.max(r_arr)/len(????)
inner_table['f_rate'] = grouped.agg(lambda row: my_agg_function(row['hire_days'],row['paid'],row['open'])`
和利率相似
最佳答案
您应该在问题中放一些DataFrame,以使其更易于回答。
根据您的需要,您可能需要使用groupby数据框的agg
方法。假设您具有以下数据框:
connected_date id number_of_clicks time_spent
0 Mon matt 15 124
1 Tue john 13 986
2 Mon matt 48 451
3 Thu jack 68 234
4 Sun john 52 976
5 Sat sabrina 13 156
您希望获得用户每天花费的时间与单个会话中的最大点击次数之和。然后,您可以使用
groupby
这样:df.groupby(['id','connected_date'],as_index = False).agg({'number_of_clicks':max,'time_spent':sum})
输出:
id connected_date time_spent number_of_clicks
0 jack Thu 234 68
1 john Sun 976 52
2 john Tue 986 13
3 matt Mon 575 48
4 sabrina Sat 156 13
请注意,我仅通过
as_index=False
来简化输出。关于python - Python Pandas:agg函数中的case语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38247763/