2017-02-08 1 views
1

Ich habe eine pandas.DataFrame die wie folgt aussieht:Zuweisen eines Satzes von Daten in Datenrahmen pandas auf einen Satz von Zuständen (Intervalle)

 mean  std 
0 0.123933 0.012185 
1 0.119992 0.023833 
2 0.119150 0.005884 
4 0.107363 0.014191 
8 0.123733 0.017090 
12 0.155717 0.021808 
18 0.337767 0.029997 
24 0.742300 0.094091 
30 1.087750 0.175827 
36 1.517833 0.196728 
42 1.181283 0.179431 
48 1.936333 0.102685 

I jede Zeile einem Zustand zugeordnet werden soll, die definiert ist durch Intervalle. d.h.

''' 
Produce 11 numbers for 10 intervals between 0 and 2. 
i.e. first interval is between intervals[0] and intervals[1] 
''' 
intervals= numpy.linspace(0,2,11) 

>>>list(intervals) 
[0.0, 
0.20000000000000001, 
0.40000000000000002, 
0.60000000000000009, 
0.80000000000000004, 
1.0, 
1.2000000000000002, 
1.4000000000000001, 
1.6000000000000001, 
1.8, 
2.0] 

Diese Zustände haben Etiketten, so index=0 in dem Datenrahmen in den ersten Zustand (S1) ext gehören würde.

Was ist der beste Weg, dies in Python zu implementieren? Ich schaue derzeit numpy.histogram, aber dies gibt die Häufigkeit in jedem Fach, anstatt den Namen des Behälters.

Die gewünschte Ausgabe würde so etwas wie:

 mean  std state 
0 0.123933 0.012185 s1 
1 0.119992 0.023833 s1 
2 0.119150 0.005884 s1 
4 0.107363 0.014191 s1 
8 0.123733 0.017090 s1 
12 0.155717 0.021808 s2 
18 0.337767 0.029997 s2 
24 0.742300 0.094091 s4 
30 1.087750 0.175827 ... 
36 1.517833 0.196728 
42 1.181283 0.179431 
48 1.936333 0.102685 
+0

Wie Bestimmen Sie den Zustand? Schaust du nur auf die mittlere Spalte und siehst, in welchem ​​Intervall es ist? Wenn ja, bekomme ich nicht dein drittes Beispiel? Der Mittelwert ist "0.158350", was "s1" sein sollte? – root

+0

Hallo Wurzel. Danke, dass du darauf hingewiesen hast. Es ist ein Fehler. Dein Recht, in welchem ​​Intervall der Mittelwert liegt. – CiaranWelsh

Antwort

2

Verwendung pd.cut:

# Define the state labels. 
labels = ['s{}'.format(i) for i in range(1, len(intervals))] 

# Perform the cut. 
df['state'] = pd.cut(df['mean'], bins=intervals, labels=labels) 

Sie müssen möglicherweise einige zusätzliche Parameter von pd.cut je nach Ihren genauen Anwendungsfall (zB dem Endpunkt der Intervall, das aufgenommen werden soll, usw.).

Die resultierende Ausgabe:

 mean  std state 
0 0.123933 0.012185 s1 
1 0.119992 0.023833 s1 
2 0.119150 0.005884 s1 
4 0.107363 0.014191 s1 
8 0.123733 0.017090 s1 
12 0.155717 0.021808 s1 
18 0.337767 0.029997 s2 
24 0.742300 0.094091 s4 
30 1.087750 0.175827 s6 
36 1.517833 0.196728 s8 
42 1.181283 0.179431 s6 
48 1.936333 0.102685 s10 
Verwandte Themen