2017-03-11 5 views
0

Ich habe diesen Datenrahmen:Python Interaktion zwischen Zeilen und Spalten von Pandas Dataframe

print (df) 
     exam  student 
    0 French  a 
    1 English  a 
    2 Italian  a 
    3 Chinese  b 
    4 Russian  b 
    5 German  b 
    6 Chinese  c 
    7 Spanish  c 
    8 English  c 
    9 French  c 

Ich brauche für jeden Schüler der Anzahl der Schüler zu finden, die die gleichen Prüfungen nahmen wie er.

exam  student total_st 
0 French  a   1 
1 English  a   1 
2 Italian  a   1 
3 Chinese  b   1 
4 Russian  b   1 
5 German  b   1 
6 German  c   2 
7 Spanish  c   2 
8 English  c   2 
9 French  c   2 

Gesamtzahl für Schüler A 1, weil es nur mit einem Schüler gemeinsame Prüfungen hat (in diesem Fall mit Schülern C):

Es soll so etwas wie diese.

Gesamtanzahl für Schüler B ist 1, weil es gemeinsame Prüfungen nur mit einem Schüler (in diesem Fall mit Schüler C) hat.

Gesamtanzahl für Schüler C ist 2, weil es gemeinsame Prüfungen mit beiden Schülern (mit Schülern A und B) hat.

Irgendwelche Ideen?

Vielen Dank im Voraus!

Antwort

2

Sie können eine Kreuztabelle von exam und student zunächst berechnen und dann ein Kreuzprodukt tun, um zu überprüfen, ob es eine Überlappung von Prüfungen zwischen Schüler und die Zahl der Studenten zu zählen, die mindestens 1 Aktie Prüfung haben, und ordnen die führen zu dem ursprünglichen Studenten Spalt:

cont_table = pd.crosstab(df.exam, df.student) 

# cont_table.T.dot(cont_table) gives a table how many exams each student shared with 
# another student, -1 to exclude the student himself 
shared_count = (cont_table.T.dot(cont_table) != 0).sum(0) - 1 
shared_count 

#student 
#a 1 
#b 1 
#c 2 
#dtype: int64 


df['total_st'] = df.student.map(shared_count) 
df 

enter image description here

+0

Sehr interessante Lösung! – MaxU

+0

@MaxU Danke für den Kommentar! – Psidom

+0

Großartig !! Vielen Dank!! – Sheron

Verwandte Themen