Pandas DataFrame

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
drindl
User
Beiträge: 5
Registriert: Sonntag 18. September 2016, 12:53

Sonntag 18. September 2016, 13:14

Ich arbeite für meine Masterarbeit das erste Mal mit pandas bzw. DataFram. Nun bin ich schon über einem Tag an dem selben Problem und finde einfach keine Lösung. Ich wäre wirklich froh, wenn mir jemand helfen könnte.

Hier ein Beispiel DataFram:
[codebox=text file=Unbenannt.txt] A B C
0 10 a 3
1 25 b 1
2 66 b 3
3 14 a 4
4 34 a 2
5 34 b 1
6 10 a 3
7 67 a 4
8 39 a 1
9 22 b 2
10 90 a 3
11 11 c 5[/code]

Nun möchte ich nur die Zeilen weiterverwenden, die auf die Zeile wo C == 4 folgen + eine zusätzliche Zeile.

Der Output müsste wie folgt aussehen:
[codebox=text file=Unbenannt.txt] A B C
4 34 a 2
5 34 b 1
8 39 a 1
9 22 b 2[/code]


Ich habe es bis jetzt hinbekommen nur die Zeilen zu erhalten, in welchen C == 4, jedoch keine zusätzlichen Zeile zu diesen Zeilen hinzu.

Code: Alles auswählen

in[1]:df[df.C== 4]

out[1]:
	A	B	C
3	14	a	4
7	67	a	4
Ich wäre wirklich froh um Unterstützung, bin langsam aber sicher am verzweifeln! ^^
Zuletzt geändert von Anonymous am Sonntag 18. September 2016, 14:20, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
BlackJack

Sonntag 18. September 2016, 16:37

@drindl: Wenn man das mal so betrachtet, dass es sich hier um Gruppen von Zeilen handelt, die mit einer 4 in Spalte C beginnen, dann könnte man eine Lösung mit der `groupby()`-Methode versuchen. Dazu kann man erst ein Array aus Spalte C erstellen bei dem die 4en mit `True` markiert sind. Das lässt sich mit der laufenden Summe zu einem Array machen in dem die Zeilen mit einer Nummer für jede Gruppe versehen sind. Dieses Array kann man für's Gruppieren verwenden, wobei es nicht als Quelle für einen neuen Index dienen soll. Von dem Gruppierungsobjekt kann man sich dann von jeder Gruppe die zweite und dritte Zeile geben lassen. Da können zwei Zeilen am Anfang zu viel sein, nämlich von der ersten Gruppe wenn die nicht mit einer 4 in Spalte C beginnt, die müsste man dann gegebenenfalls entfernen.

Code: Alles auswählen

In [118]: df
Out[118]: 
     A  B  C
0   10  a  3
1   25  b  1
2   66  b  3
3   14  a  4
4   34  a  2
5   34  b  1
6   10  a  3
7   67  a  4
8   39  a  1
9   22  b  2
10  90  a  3
11  11  c  5

In [119]: df.C == 4
Out[119]: 
0     False
1     False
2     False
3      True
4     False
5     False
6     False
7      True
8     False
9     False
10    False
11    False
Name: C, dtype: bool

In [120]: (df.C == 4).cumsum()
Out[120]: 
0     0
1     0
2     0
3     1
4     1
5     1
6     1
7     2
8     2
9     2
10    2
11    2
Name: C, dtype: int32

In [121]: g = df.groupby((df.C == 4).cumsum(), as_index=False)

In [122]: g.nth([1, 2])
Out[122]: 
    A  B  C
1  25  b  1
2  66  b  3
4  34  a  2
5  34  b  1
8  39  a  1
9  22  b  2

In [123]: g.nth([1, 2]).iloc[2:]
Out[123]: 
    A  B  C
4  34  a  2
5  34  b  1
8  39  a  1
9  22  b  2
drindl
User
Beiträge: 5
Registriert: Sonntag 18. September 2016, 12:53

Sonntag 18. September 2016, 16:46

@BlackJack: Vielen Dank für deinen Lösungsvorschlag! Den versuche ich sofort in meinem Programm umzusetzen!

Liebe Grüsse
drindl
Antworten