2017-08-26 4 views
0

Ich habe Schule Anwendungsdaten-Tabelle, die wie folgt aussieht ...Abfrage mehrere Spalten in einer Datenbank und finden ihre Summe

create table todel (user_id int, SchemesApplicable1 int, SchemesApplicable2 int, 
SchemesApplicable3 int, SchemesApplicable4 int); 

insert into todel values (1, 1, 0, 1, 0); 

insert into todel values (2, 0, 0, 0, 0); 

insert into todel values (3, 1, 0, 1, 0); 

insert into todel values (4, 1, 0, 0, 0); 

insert into todel values (5, 1, 0, 1, 1); 

    SELECT Count(User_Id) as No_Off_Application , 
sum(if(SchemesApplicable1 = 1, 1, 0)) as first, 
sum(if(SchemesApplicable2 = 1, 1, 0)) as second, 
sum(if(SchemesApplicable3 = 1, 1, 0)) as third, 
sum(if(SchemesApplicable4 = 1, 1, 0)) as forth 
FROM todel 

Die obige Abfrage einen Bericht wie folgt zurück ...

No_Off_Application first second third forth 
5 4 0 3 1 

Ich möchte eine weitere Spalte mit den Bewerbern hinzufügen, die für mehr als ein Schema beantragt haben. Die erwartete Anzahl ist 3 (Benutzer-ID 1, 3 und 5) Wie schreibe ich eine Abfrage für diese?

+1

Was hat das mit Pandas zu tun? –

+0

Ich wollte nur wissen, wie Pandas damit umgehen würden – shantanuo

+0

Nun, los gehts. –

Antwort

1
SELECT Count(User_Id) as No_Off_Application , 
     sum(SchemesApplicable1) as first, 
     sum(SchemesApplicable2) as second, 
     sum(SchemesApplicable3) as third, 
     sum(SchemesApplicable4) as forth, 
     sum(SchemesApplicable1 + SchemesApplicable2 + SchemesApplicable3 + SchemesApplicable4 >= 1) as users_at_least_with_one_application 
FROM todel 
1

Hier ist das Setup für Pandas:

print(df.iloc[:, 1:].sum(1)) 

0 2 
1 0 
2 2 
3 1 
4 3 
dtype: int64 

die um nur zu erhalten:

df = pd.DataFrame([[1, 1, 0, 1, 0], 
        [2, 0, 0, 0, 0,], 
        [3, 1, 0, 1, 0], 
        [4, 1, 0, 0, 0], 
        [5, 1, 0, 1, 1]], 
       columns=['user_id', 'Scheme1', 'Scheme2', 'Scheme3', 'Scheme4']) 
print(df) 

    user_id Scheme1 Scheme2 Scheme3 Scheme4 
0  1  1  0  1  0 
1  2  0  0  0  0 
2  3  1  0  1  0 
3  4  1  0  0  0 
4  5  1  0  1  1 

Pandas Verwendung, die Gesamtzahl der Systeme pro Benutzer zu überprüfen, Sie df.sum(axis=1) verwenden würde, user_ids, können Sie boolesche Indizierung verwenden:

user_id_ser = df.user_id[df.iloc[:, 1:].sum(1) > 1] 
print(user_id_ser) 

0 1 
2 3 
4 5 
Name: user_id, dtype: int64 

Um ein „Flag/Indicator“ Spalte hinzufügen, erhalten Sie eine Maske mit > 1 erstellen müssen und konvertieren df.astype in Integer mit:

df['Schemes > 1'] = (df.iloc[:, 1:].sum(1) > 1).astype(int) 
print(df) 

    user_id Scheme1 Scheme2 Scheme3 Scheme4 Schemes > 1 
0  1  1  0  1  0   1 
1  2  0  0  0  0   0 
2  3  1  0  1  0   1 
3  4  1  0  0  0   0 
4  5  1  0  1  1   1 

Schließlich Ihre genaue Ausgabe zu erhalten, Sie df.where verwenden können:

print(df.where(df > 0).count()) 

user_id  5 
Scheme1  4 
Scheme2  0 
Scheme3  3 
Scheme4  1 
Schemes > 1 3 
dtype: int64 
Verwandte Themen