2016-06-01 11 views
3

Dies ist von Probe csvZählfrequenz einer Zahl in einer Spalte, während gleich in einer anderen Spalte

Grob sieht es so aus 5 Spalten

Zwischenablage in Text:

Year Course Modul Q1 Q2 
2015 Physics CS1203 4 2 
2015 Physics CS1203 4 3 
2015 Physics CS1203 3 1 
2015 Physics CS1203 4 4 
2015 English IR0001 2 5 
2015 English IR0001 1 2 
2015 English IR0001 3 1 
2015 English IR0001 5 3 
2015 English IR0001 4 3 

Code:

df = pd.read_clipboard() 

Ich gruppiert nach Modulen, jetzt möchte ich die Anzahl der 4s in Modul CS1203 zählen. Ich bin neu hier, also tut mir leid im Voraus, wenn das eine dumme Frage ist. Ich schätze deine Hilfe sehr.

Danke

+0

Können Sie Bild als Text hinzufügen, um zu antworten? – jezrael

Antwort

2

Ich glaube, Sie brauchen boolean indexing:

print (df[(df.module == 'CS1203') & (df.q1 == 4)]) 
    year course module q1 q2 
0 2015 Physics CS1203 4 2 
1 2015 Physics CS1203 4 3 
3 2015 Physics CS1203 4 4 

print (len(df[(df.module == 'CS1203') & (df.q1 == 4)])) 
3 

Wenn in allen q Spalten zählen müssen zuerst melt verwenden:

df = pd.melt(df, id_vars=['year','course','module'], value_name='q') 
    year course module q1 q2 
0 2015 Physics CS1203 4 2 
1 2015 Physics CS1203 4 3 
2 2015 Physics CS1203 3 1 
3 2015 Physics CS1203 4 4 
4 2015 English IR0001 2 5 
5 2015 English IR0001 1 2 
6 2015 English IR0001 3 1 
7 2015 English IR0001 5 3 
8 2015 English IR0001 4 3 

print (df[(df.module == 'CS1203') & (df.q == 4)]) 
    year course module variable q 
0 2015 Physics CS1203  q1 4 
1 2015 Physics CS1203  q1 4 
3 2015 Physics CS1203  q1 4 
12 2015 Physics CS1203  q2 4 

print (len(df[(df.module == 'CS1203') & (df.q == 4)])) 
4 
+0

Danke jezrael – EricJames

+0

Danke @jezrael für Ihre Hilfe gestern, war Ihre Antwort sehr hilfreich. Ich stieß jedoch auf ein anderes Problem und würde Ihre Hilfe sehr schätzen. Die obige CSV-Datei - Ich möchte eine Funktion erstellen - wenn wir das Skript ausführen, werden wir aufgefordert, Modulcode einzugeben. Wenn Modul-Code gleich unserem Modul in der Liste als Summe Länge von 4 und 5 und dividieren durch insgesamt * 100. Wenn ein Benutzer einen Modulcode eingibt, sollte das Skript den Prozentwert zurückgeben. Kannst du mir bitte helfen, wie kann ich das machen? Ich schätze deine Hilfe sehr. – EricJames

2

Sie Ihre DF durch das Modul zuerst filtern (df.module == 'CS1203'), dann Filterspalten, die nur diejenigen auswählen, die übereinstimmen q\d+ RegEx, nur auswählen 4 s und berechnet schließlich die Summe:

In [74]: (df[df.module == 'CS1203'].filter(regex=r'q\d+') == 4).sum() 
Out[74]: 
q1 3 
q2 1 
dtype: int64 
1

Vielleicht können Sie so etwas wie dies versuchen:

df.groupby(['module','q1'])['module'].agg({'Frequency':'count'}) 

diese post verweisen.

Verwandte Themen