2016-07-10 7 views
0

Meine Datenrahmen sieht wie folgt aus:Python & Pandas: Stellen Sie einen beliebigen Wert auf eine Spalte, basierend auf Bedingungen

enter image description here

ich die speed in eine einheitliche Zufallswert zwischen 0,1 gesetzt werden soll, wenn die dir ist 999, und wenn ‚Geschwindigkeit‘ 0

ist ich dies tun:

df.loc[(df['dir'] == 999)&(df['speed'] == 0), 'speed'] = np.random.uniform(0,1) 

Aber es stellt sich jeder Geschwindigkeit gegeben wird in gleichen Wert:

date 
19800111 0.453046 
19800111 0.453046 
19800111 0.453046 
19800111 0.453046 
19800111 0.453046 
19800111 0.453046 
19800111 0.453046 
19800111 0.453046 

Ich bin mir nicht sicher, was ich falsch gemacht habe? Wie kann ich das beheben?

+0

Bitte nicht verwenden, png, kippen Benutzer Ausschneiden und Einfügen von Daten. – Merlin

Antwort

1

Sie "senden" np.random.uniform(0,1) an alle Zeilen, dh Sie rufen nur np.random.uniform(0,1) einmal an. Deshalb sehen Sie immer die gleiche Nummer.

Sie können Ihre Datenrahmen aktualisieren, basierend auf Ihre Bedingungen wie so:

In [46]: data = [{"dir":310, "speed":5.1}, {"dir":999, "speed":0}] 

In [47]: df = pd.DataFrame(data) 

In [48]: df 
Out[48]: 
    dir speed 
0 310 5.1 
1 999 0.0 

In [49]: df.speed = df.apply(lambda x: np.random.uniform(0, 1) if x.speed == 0 and x.dir == 999 else x.speed, axis=1) 

In [50]: df 
Out[50]: 
    dir  speed 
0 310 5.100000 
1 999 0.948842 
+0

Muss ich 'df.loc [(df ['dir'] == 999) eingeben & (df ['speed'] == 0), 'speed'] =' vor deinem Code? Das sieht sehr lang und seltsam aus ... – cqcn1991

+0

Das Problem, das ich frage, ist '.loc []. Apply' gibt den korrekten Wert zurück (Ramdon-Wert unterscheidet sich von einander), aber wie soll ich sie in die 'df setzen '? Addiere die Länge 'df.loc [(df ['dir'] == 999) & (df ['speed'] == 0), 'speed'] ='? – cqcn1991

+0

@ cqcn1991 siehe Bearbeiten. Nicht sicher, was dir seltsam erscheint. Ist es das Lambda? Es ist nur eine anonyme Funktion, die Aufrufe für jedes Element anwendet. –

2

Alternativ können Sie den size Parameter in der uniform Funktion angeben, um die Anzahl der Zeilen, um gleich, die Sie ändern möchten:

ind = (df['dir'] == 999) & (df['speed'] == 0) 
df.loc[ind, 'speed'] = np.random.uniform(0, 1, size = sum(ind)) 
0
df['speed'] = np.where((df['dir'] == 999) & (df['speed'] == 0), np.random.uniform(0,1), df['speed']) 
+0

Wenn die Antwort richtig ist, bitte als richtig markieren. Und vergessen Sie nicht zu upvote – Merlin

Verwandte Themen