2016-06-11 16 views
1

Ich habe einen Pandas Datenrahmen, die wie folgt aussieht:Trennelemente eines Pandas Datenrahmen in Python

Time Measurement 
0  0   1 
1  1   2 
2  2   3 
3  3   4 
4  4   5 
5  0   2 
6  1   3 
7  2   4 
8  3   5 
9  4   6 
10  0   3 
11  1   4 
12  2   5 
13  3   6 
14  4   7 
15  0   1 
16  1   2 
17  2   3 
18  3   4 
19  4   5 
20  0   2 
21  1   3 
22  2   4 
23  3   5 
24  4   6 
25  0   3 
26  1   4 
27  2   5 
28  3   6 
29  4   7 

, die mit dem folgenden Code erzeugt werden können:

import pandas 
time=[0,1,2,3,4] 
repeat_1_conc_1=[1,2,3,4,5] 
repeat_1_conc_2=[2,3,4,5,6] 
repeat_1_conc_3=[3,4,5,6,7] 
d1=pandas.DataFrame([time,repeat_1_conc_1]).transpose() 
d2=pandas.DataFrame([time,repeat_1_conc_2]).transpose() 
d3=pandas.DataFrame([time,repeat_1_conc_3]).transpose() 
repeat_2_conc_1=[1,2,3,4,5] 
repeat_2_conc_2=[2,3,4,5,6] 
repeat_2_conc_3=[3,4,5,6,7] 
d4=pandas.DataFrame([time,repeat_2_conc_1]).transpose() 
d5=pandas.DataFrame([time,repeat_2_conc_2]).transpose() 
d6=pandas.DataFrame([time,repeat_2_conc_3]).transpose() 
df= pandas.concat([d1,d2,d3,d4,d5,d6]).reset_index() 
df.drop('index',axis=1,inplace=True) 
df.columns=['Time','Measurement'] 
print df 

Wenn Sie auf der Suche Code, Sie werden sehen, dass ich zwei experimentelle Wiederholungen im selben Datenrahmen habe, die bei df.iloc[:15] getrennt werden sollten. Außerdem habe ich innerhalb jedes Experiments 3 Sub-Experimente, die man sich wie die Startbedingungen einer Dosisantwort vorstellen kann, dh das erste Sub-Experiment beginnt mit 1, das zweite mit 2 und das dritte mit 3. Diese sollten in Indexintervallen von `len (time) ', das ist 0-4, 5 Elemente für jede experimentelle Wiederholung. Könnte mir bitte jemand sagen, wie ich diese Daten am besten für jeden Versuch in einzelne Zeitverlaufsmessungen unterteilen kann? Ich bin mir nicht ganz sicher, was die beste Datenstruktur wäre, aber ich muss einfach in der Lage sein, auf jede Daten für jedes Unterexperiment für jede experimentelle Wiederholung einfach zuzugreifen. Vielleicht irgendwann wie:

repeat1= 
    Time Measurement 
0  0   1 
1  1   2 
2  2   3 
3  3   4 
4  4   5 


5  0   2 
6  1   3 
7  2   4 
8  3   5 
9  4   6 


10  0   3 
11  1   4 
12  2   5 
13  3   6 
14  4   7 

Repeat 2= 
     Time Measurement 
15  0   1 
16  1   2 
17  2   3 
18  3   4 
19  4   5 


20  0   2 
21  1   3 
22  2   4 
23  3   5 
24  4   6 


25  0   3 
26  1   4 
27  2   5 
28  3   6 
29  4   7 
+0

Was sind 'repeat1' und 'Repeat 2' - Datenrahmen? Oder möchten Sie einfach Ihren DF so drucken, dass er ihn auf diese Weise trennt? – MaxU

+0

Ich kenne nicht die beste Datenstruktur, um diese Daten einzugeben. Aber die Kriterien sind, dass ich in der Lage sein muss, leicht auf jede Startbedingung (Subexperiment) für jede Wiederholung zuzugreifen – CiaranWelsh

Antwort

1

IIUC, können Sie einen Multiindex festgelegt, so dass Sie indizieren Ihre DF Zugriff auf Experimente und subexperiments leicht:

In [261]: dfi = df.set_index([df.index//15+1, df.index//5 - df.index//15*3 + 1]) 

In [262]: dfi 
Out[262]: 
    Time Measurement 
1 1  0   1 
    1  1   2 
    1  2   3 
    1  3   4 
    1  4   5 
    2  0   2 
    2  1   3 
    2  2   4 
    2  3   5 
    2  4   6 
    3  0   3 
    3  1   4 
    3  2   5 
    3  3   6 
    3  4   7 
2 1  0   1 
    1  1   2 
    1  2   3 
    1  3   4 
    1  4   5 
    2  0   2 
    2  1   3 
    2  2   4 
    2  3   5 
    2  4   6 
    3  0   3 
    3  1   4 
    3  2   5 
    3  3   6 
    3  4   7 

Auswahl subexperiments

In [263]: dfi.loc[1,1] 
Out[263]: 
    Time Measurement 
1 1  0   1 
    1  1   2 
    1  2   3 
    1  3   4 
    1  4   5 

In [264]: dfi.loc[2,2] 
Out[264]: 
    Time Measurement 
2 2  0   2 
    2  1   3 
    2  2   4 
    2  3   5 
    2  4   6 

zweiten Experiment wählen mit allen Unterexperimenten:

In [266]: dfi.loc[2,:] 
Out[266]: 
    Time Measurement 
1  0   1 
1  1   2 
1  2   3 
1  3   4 
1  4   5 
2  0   2 
2  1   3 
2  2   4 
2  3   5 
2  4   6 
3  0   3 
3  1   4 
3  2   5 
3  3   6 
3  4   7 

alternativ können Sie Ihre eigene Slicing-Funktion erstellen:

def my_slice(rep=1, subexp=1): 
    rep -= 1 
    subexp -= 1 
    return df.ix[rep*15 + subexp*5 : rep*15 + subexp*5 + 4, :] 

Demo:

In [174]: my_slice(1,1) 
Out[174]: 
    Time Measurement 
0  0   1 
1  1   2 
2  2   3 
3  3   4 
4  4   5 

In [175]: my_slice(2,1) 
Out[175]: 
    Time Measurement 
15  0   1 
16  1   2 
17  2   3 
18  3   4 
19  4   5 

In [176]: my_slice(2,2) 
Out[176]: 
    Time Measurement 
20  0   2 
21  1   3 
22  2   4 
23  3   5 
24  4   6 

PS bisschen bequemer Weg, um Ihre DFs zu verketten:

df = pandas.concat([d1,d2,d3,d4,d5,d6], ignore_index=True) 

so tun Sie nicht brauche folgende .reset_index() und drop()

+0

Fantastisch, genau wonach ich gesucht habe. Danke – CiaranWelsh

+0

@ user3059024, Sie sind herzlich willkommen! :) Danke für die Annahme der Antwort! – MaxU

Verwandte Themen