2016-12-09 8 views
0

So habe ich Daten von einem SQL-Server abgerufen und in einen Datenrahmen eingegeben. Alle Daten haben eine diskrete Form und erhöhen sich um 0,1 Schritte in einer Richtung (0,0, 0,1, 0,2 ... 9,8, 9,9, 10,0) mit mehreren Leistungswerten für jeden Schritt (z. B. 1000, 1412, 134,5, 657,1 at 0,1), (14,5, 948,1, 343,8 bei 5,5) - hoffentlich siehst du, was ich sagen will.Müssen Sie einen Pandas (Python) Datenrahmen mit Werten von einem anderen Datenrahmen vergleichen

Ich habe es geschafft, die Daten in diese einzelnen Schritte mit den folgenden zu gruppieren, und haben dann den Mittelwert und die Standardabweichung für jede Gruppe genommen.

group = df.groupby('step').power.mean() group2 = df.groupby('step').power.std().fillna(0)

Dies führt zu zwei Datenrahmen (Gruppe und group2), die den Mittelwert und die Standardabweichung für jede der Stufen 0,1 aufweisen. Es ist dann einfach, eine obere und untere Grenze für jeden Schritt mit dem folgenden zu erstellen:

upperlimit = group + 3*group2 lowerlimit = group - 3*group2 lowerlimit[lowerlimit<0] = 0

Jetzt kommt das Bit Ich bin verwirrt über! Ich muss zurück in den ursprünglichen Datenrahmen gehen und Zeilen/Instanzen entfernen, in denen der Leistungswert außerhalb dieser berechneten Grenzen liegt (beachten Sie, dass es für jeden 0,1 Schritt eine andere obere und untere Grenze gibt).

Hier ist 50 Zeilen der Beispieldaten:

Index Power    Step 
0  106.0    5.0 
1  200.4    5.5 
2  201.4    5.6 
3  226.9    5.6 
4  206.8    5.6 
5  177.5    5.3 
6  124.0    4.9 
7  121.0    4.8 
8   93.9    4.7 
9  135.6    5.0 
10  211.1    5.6 
11  265.2    6.0 
12  281.4    6.2 
13  417.9    6.9 
14  546.0    7.4 
15  619.9    7.9 
16  404.4    7.1 
17  241.4    5.8 
18  44.3    3.9 
19  72.1    4.6 
20  21.1    3.3 
21   6.3    2.3 
22   0.0    0.8 
23   0.0    0.9 
24   0.0    3.2 
25   0.0    4.6 
26  33.3    4.2 
27  97.7    4.7 
28  91.0    4.7 
29  105.6    4.8 
30  97.4    4.6 
31  126.7    5.0 
32  134.3    5.0 
33  133.4    5.1 
34  301.8    6.3 
35  298.5    6.3 
36  312.1    6.5 
37  505.3    7.5 
38  491.8    7.3 
39  404.6    6.8 
40  324.3    6.6 
41  347.2    6.7 
42  365.3    6.8 
43  279.7    6.3 
44  351.4    6.8 
45  350.1    6.7 
46  573.5    7.9 
47  490.1    7.5 
48  520.4    7.6 
49  548.2    7.9 
+0

Veröffentlichen Sie Ihre Daten und Proben Ihres Datenrahmen. Googeln Sie auch die Pandas.DataFrame.Lookup() -Funktion. – Chuck

+1

Post 'group' und' group2' Sie müssen so viele Informationen wie hilfreich und relevant geben. – Chuck

Antwort

1

Um Ihnen Ziel anders gesagt, einige Manipulationen auf gruppierte Daten durchführen möchten, und projizieren dann die Ergebnisse dieser Manipulationen zurück zu den nicht gruppierten Zeilen so Sie können sie zum Filtern dieser Zeilen verwenden. Eine Möglichkeit dafür ist transform:

Die Transformationsmethode gibt ein Objekt zurück, das mit der gleichen (gleichen Größe) indiziert ist wie die Gruppierung. Daher sollte die übergebene Transformationsfunktion ein Ergebnis zurückgeben, das die gleiche Größe wie der Gruppen-Chunk hat.

Sie können dann die neuen Zeilen erstellen direkt:

df['upper'] = df.groupby('step').power.transform(lambda p: p.mean() + 3*p.std().fillna(0)) 
df['lower'] = df.groupby('step').power.transform(lambda p: p.mean() - 3*p.std().fillna(0)) 
df.loc[df['lower'] < 0, 'lower'] = 0 

und Art entsprechend:

df = df[(df.power <= df.upper) & (df.power >= df.lower())] 
+0

Das ist fantastisch! Ich danke dir sehr. Um jedoch ein kleines Element der Komplexität hinzuzufügen - wenn es einen eindeutigen Wert von 'Schritt' gibt, entfernt diese Methode diese Zeile des Datenrahmens vollständig (mathematisch sinnvoll). Ist es möglich, diese einzigartige Reihe zu behalten? Zum Beispiel, der Wert von 5.3 in "Schritt" (Leistung = 177.5, Index = 5) tritt nur einmal, natürlich Rendern einer Standardabweichung von Null, und so die oberen und unteren Grenzen als genau gleich dem Leistungswert zu erstellen von 177,5. Ich möchte diesen Punkt jedoch für Analysezwecke beibehalten, da es der einzigartige Wert von "Schritt" ist. Danke – PenguinProgrammer

+0

Mein Vorschlag würde sein, die Daten zu entfernen, die Sie vor dem Filtern aus dem Filter ausschließen möchten, und es dann wieder hinzuzufügen, sobald die Filterung abgeschlossen ist. – ASGM

Verwandte Themen