Liste für Versuch erstellen

Du hast eine Idee für ein Projekt?
Antworten
sukijami
User
Beiträge: 2
Registriert: Freitag 3. März 2023, 10:28

Guten Tag!

Ich möchte eine Liste erstellen für 20 Probanden, bei denen durch Zufall die Reihenfolge einer Versuchsbedingung vergeben wird.
Soweit habe ich alles, aber nur für eine Person.
Auch wenn ich den Code als for loop laufen lasse, wird mir immer nur ein Dataframe für eine Person ausgeben.

Hier der Code:

Code: Alles auswählen

import random
import pandas as pd


for i in range (1, 21):
    subject_df = pd.DataFrame()
    participant = [1]*2
    ls_exc = ["MB", "PC"]
    tasks = ["CO", "IS"] 
    base_eeg = [random.random()]
    random_exc =[random.choice(ls_exc)]
    zipped_list = list(zip(participant, random_exc*2))
    participant, random_exc = zip(*zipped_list)
    random.shuffle(tasks)
    participant1, exc1 = zip(*zipped_list) 
    base_eeg = [random.random()]
   
    subject_df["participant"] =  participant1
    subject_df["exc"] =  exc1
    subject_df["tasks"] =  tasks
    subject_df["base_eeg"] = base_eeg*2


subject_df

Kann mir wer helfen? Wo liegt mein Fehler??

Danke schonmal!!

sukijami
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Was machst du da für komplizierte Sachen mit `zip`, nur dass das `participant` nur wieder den selben Wert hat wie am Anfang? `base_eeg` wird auch mehrfach erzeugt.
Da du in jedem Schleifendurchgang subject_df neu erzeugst, ist natrülich nur noch der Dataframe aus dem letzten Durchlauf vorhanden.
`tasks` ist eine Liste von Tasks, im Dataframe hat dann aber die Spalte `tasks` nur einen Task. Das ist sehr verwirrend.

Am besten teilst Du Dir die Aufgaben in mehrere Funktionen, eine, die einen Eintrag erzeugst, und dann Schleifen, um alle Einträge in einer Liste zu sammeln:

Code: Alles auswählen

import random
import pandas as pd

def generate_participant_task(participant, exc, task, base_eeg):
    return {
        "participant": participant,
        "exc": exc,
        "task": task,
        "base_eeg": base_eeg,
    }

tasks = ["CO", "IS"] 
ls_exc = ["MB", "PC"]
entries = []
for participant in range(1, 21):
    random.shuffle(tasks)
    random_exc =random.choice(ls_exc)
    base_eeg = random.random()
    for task in random.sample(tasks, len(tasks)):
        entries.append(generate_participant_task(participant, random_exc, task, base_eeg))
    
subject_df = pd.DataFrame(entries)
sukijami
User
Beiträge: 2
Registriert: Freitag 3. März 2023, 10:28

Besten Dank, Sirius3!

Keine Ahnung, warum ich dass so verwirrend gemacht habe, kam mir irgendwie logisch vor ;)
Meinen Fehler in dem Schleifendurchgang sehe ich jetzt! Klar, dass er Dataframe dann immer "überschrieben" wurde.
Antworten