2017-05-31 6 views
2

Ich habe einen Pandas Datenrahmen, und ich muss eine Spalte basierend auf einer vorhandenen Spalte erstellen (nicht hart), aber ich brauche den i th Wert auf der i-1 th Wert von basieren die Kolumne. Beispielserie:Pandas Operationen auf Spalten basierend auf anderen Einträgen

data = np.array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1]) 

Ich möchte das i te Element 1 sein, wenn es der Beginn einer Reihe von 1 s, zB:

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 

Es gibt noch andere Operationen Ich mag würde sein in der Lage zu tun, aber nur zu verstehen, wie dies ohne Durchlaufen zu tun wäre unglaublich hilfreich. Ich entschuldige mich, wenn das gefragt wurde, war ich nicht sicher, wie man danach sucht.

Antwort

2

Wenn 1 der Anfang einer Gruppe ist, bedeutet das, dass es 1 ist und das vorherige Element nicht 1. Dies ist in Pandas etwas einfacher als in reinem numpy, weil "das vorherige Element nicht 1" sein kann übersetzt mit einer shift, die alle Daten bewegt (standardmäßig 1 vorwärts).

In [15]: s = pd.Series([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1]) 

In [16]: ((s == 1) & (s.shift() != 1)).astype(int) 
Out[16]: 
0  0 
1  0 
2  0 
3  1 
4  0 
5  0 
6  0 
7  1 
8  0 
9  0 
10 0 
11 1 
12 0 
13 0 
dtype: int64 

Auch der Fall, wo 1 ist das erste Element funktionieren wird, weil da vor dem 1. kein Element gibt es uns ein NaN nach der Verschiebung erhalten, und NaN = 1:

n [18]: s.shift().head() 
Out[18]: 
0 NaN 
1 0.0 
2 0.0 
3 0.0 
4 1.0 
3

np.where

# [0 0 0 1 1 1 0 1 0 0 0 1 1 1] <- data 
# [0 0 0 0 1 1 1 0 1 0 0 0 1 1] <- np.append(0, data[:-1]) 
#^\__shifted data d[:-1]__/ 
# | 
# appended zero 
# [1 1 1 1 0 0 0 1 0 1 1 1 0 0] <- ~np.append(0, data[:-1]) 
# [0 0 0 1 0 0 0 1 0 0 0 1 0 0] <- result 

np.where(data & ~np.append(0, data[:-1]).astype(bool), 1, 0) 

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 

Verwenden von Array-Multiplikation

data * (1 - np.append(0, data[:-1])) 

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 

np.diff

(np.diff(np.append(0, data)) == 1).astype(int) 

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 
+0

Danke für die Antwort, aber leider kann ich beides nicht akzeptieren. Ich akzeptierte seine meistens, weil ich es leichter auf meine anderen Probleme verallgemeinern kann. – riders994

+0

@ riders994 das ist ein guter Grund, DSM Antwort zu wählen. Keine Notwendigkeit, Ihre Wahl zu begründen. Ich bin froh, dass du eine Antwort angenommen hast :-) – piRSquared

Verwandte Themen