Seite 1 von 1

Liste für Versuch erstellen

Verfasst: Freitag 3. März 2023, 10:50
von sukijami
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

Re: Liste für Versuch erstellen

Verfasst: Freitag 3. März 2023, 13:47
von Sirius3
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)

Re: Liste für Versuch erstellen

Verfasst: Freitag 3. März 2023, 14:56
von sukijami
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.