2016-07-07 11 views
1

Ich habe SQL-Anweisung wie folgt aus:Python Pandas: case-Anweisung in agg Funktion

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 

ich Umschreiben Sie sich mit der Pandas versuchen: zuerst werde ich Datenrahmen für "innere" Tabelle erstellen:

filtered_data = data.where(data['alloc_date'] <= analysis_date) 

dann werde ich Gruppe diese Daten

grouped = filtered_data.groupby(['id','connected_date']) 

Aber was ich habe zum Filtern jeder Spalte verwenden und verwende max/sum darauf.

habe ich versucht, so etwas wie dieses:

`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'])` 

und etwas ähnliches für Rate

Antwort

1

Sie ein wenig Datenrahmen in Frage stellen sollte es leichter zu beantworten.

Für Ihren Bedarf möchten Sie möglicherweise agg Methode der Groupby Dataframes verwenden. Nehmen wir an, Sie folgende Datenrahmen haben:

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 

Und Sie wollen die Summe der Zeit vom User bis zum Tag und die maximale Klicks in einer einzigen Sitzung ausgegeben zu bekommen. Dann nutzen Sie groupby auf diese Weise:

df.groupby(['id','connected_date'],as_index = False).agg({'number_of_clicks':max,'time_spent':sum}) 

Ausgang:

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 

Bitte beachte, dass ich nur die as_index=False zur Klarheit der den Ausgang weitergegeben.

+0

Okay, lassen Sie uns Bild, dass die Anzahl der Klicks aussieht (.023, 1.2, 0.4, 2.4, 2.1, .1, .2) und U wollen Summe aber nicht wie (.023 +1,2 und etc) aber wenn number_of_clicks <1 dann 0 else 1 und danach summe berechnen (1 + 1 + 0 + 1 ..) – gostin

+0

Dann vor deiner groupby etwas tun wie: 'df ['number_of_clicks'] = df ['number_of_clicks']> = 1' . Sie erhalten die 'Serie' von booleschen Werten (die auch 0 und 1 zu python sind), und die Summe in groupby gibt Ihnen, was Sie wollen. – ysearka

Verwandte Themen