2016-07-10 7 views
0

マイデータフレームの外観:パイソン&パンダは:条件に基づいて、列にランダムな値を設定し、このような

enter image description here

私があれば、0,1の間で一様乱数値にspeedを設定したいですdirは999であると「スピード」は0

であれば、私はこれを実行します。

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

をしかし、それはすべての速度が設定されているが判明しました同じ値に:

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 

私は何が間違っているのか分かりませんか?これをどうすれば解決できますか?

+0

利用PNG、ユーザーカットアンドペーストカントデータをいけないしてください。 – Merlin

答えて

1

np.random.uniform(0,1)を1回呼び出すだけで、すべての行にnp.random.uniform(0,1)をブロードキャストしています。このため、常に同じ番号が表示されます。あなたがそうのようなあなたの条件に基づいてデータフレームを更新することができ

また
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

あなたのコードの前に 'df.loc [(df ['dir'] == 999)&(df ['speed'] == 0)、 'speed'] ='を入れる必要がありますか?これは非常に長くて奇妙に見えます.... – cqcn1991

+0

'.loc []。apply'は正しい値(互いに異なるramdon値)を返しますが、私は' df '? df.loc [(df ['dir'] == 999)&(df ['speed'] == 0)、 'speed'] = '? – cqcn1991

+0

@ cqcn1991編集を参照してください。何があなたに奇妙に見えるか分からない。それはラムダですか?それは各要素の呼び出しを適用する無名関数です。 –

2

、あなたが変更しようとしている行の数に等しくなるようにuniform機能でsizeパラメータを指定することができます。

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

答えが正しい場合は、正しいものとしてマークしてください。そしてupvoteに忘れないでください – Merlin

関連する問題