2017-05-04 14 views
2

私は自分のデータにノイズを追加する必要があるので、私のパンダのデータフレームのすべてのセルに異なる乱数を追加したいと思います。このコードはうまくいきますが、うんざりしているようです。より良い方法がありますか?パンダのデータフレーム内のすべてのセルに異なる乱数を追加

import pandas as pd 
import numpy as np 
df = pd.DataFrame(0.0, index=[1,2,3,4,5], columns=list('ABC')) 
print df 
for x,line in df.iterrows(): 
    for col in df: 
    line[col] = line[col] + (np.random.rand()-0.5)/1000.0 
print df 
+0

ここで '-0.5/1000.0'の意味は何ですか – EdChum

+0

このように' 'df = pd.DataFrame(np.random.randn(3,5)、columns = list( 'ABC')) df.apply(ラムダx:x +(np.random.rand() - 0.5)/ 1000) 'うまく動作します –

+0

e.arbitrioそれは動作しませんでした。私は各列のすべての行に対して同じ乱数を得ました。 – TPM

答えて

5
df + np.random.rand(*df.shape)/10000.0 

または

さんはapplymapを使用してみましょう:

df = pd.DataFrame(1.0, index=[1,2,3,4,5], columns=list('ABC')) 

df.applymap(lambda x: x + np.random.rand()/10000.0) 

は出力:ゼロ以外のデータについては

            A \ 
1 [[1.00006953418, 1.00009164785, 1.00003177706]... 
2 [[1.00007291245, 1.00004186046, 1.00006935173]... 
3 [[1.00000490127, 1.0000633115, 1.00004117181],... 
4 [[1.00007159622, 1.0000559506, 1.00007038891],... 
5 [[1.00000980335, 1.00004760836, 1.00004214422]... 

                B \ 
1 [[1.00000320322, 1.00006981682, 1.00008912557]... 
2 [[1.00007443802, 1.00009270815, 1.00007225764]... 
3 [[1.00001371778, 1.00001512412, 1.00007986851]... 
4 [[1.00005883343, 1.00007936509, 1.00009523334]... 
5 [[1.00009329606, 1.00003174878, 1.00006187704]... 

                C 
1 [[1.00005894836, 1.00006592776, 1.0000171843],... 
2 [[1.00009085391, 1.00006606979, 1.00001755092]... 
3 [[1.00009736701, 1.00007240762, 1.00004558753]... 
4 [[1.00003981393, 1.00007505714, 1.00007209959]... 
5 [[1.0000031608, 1.00009372917, 1.00001960112],... 
+0

ありがとうございます。これは機能しますが、5x3のデータフレームでのみ有効です。あなたは(5,3)部分を削除するために編集することができます(それでも動作します)。そして正しい答えとしてマークします。 – TPM

+1

@Scott、最初のソリューションをチェックするだけで、データフレームの各要素に同じ乱数が追加されますが、2番目のソリューションではdfの各値に別の乱数が追加されますか? – tfcoe

+0

@tfcoeあなたは正しいですか?その最初のステートメントを少し修正しましょう。それは固定されています。 –

3

これは、より簡潔法と同等になります:あなたはadd、非ゼロ値を持つ既存のDFにこれをやっている場合は

In [147]: 
df = pd.DataFrame((np.random.rand(5,3) - 0.5)/1000.0, columns=list('ABC')) 
df 

Out[147]: 
      A   B   C 
0 0.000381 -0.000167 0.000020 
1 0.000482 0.000007 -0.000281 
2 -0.000032 -0.000402 -0.000251 
3 -0.000037 -0.000319 0.000260 
4 -0.000035 0.000178 0.000166 

In [149]: 
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC')) 
df 

Out[149]: 
      A   B   C 
0 -1.705644 0.149067 0.835378 
1 -0.956335 -0.586120 0.212981 
2 0.550727 -0.401768 1.421064 
3 0.348885 0.879210 0.136858 
4 0.271063 0.132579 1.233789 

In [154]: 
df.add((np.random.rand(df.shape[0], df.shape[1]) - 0.5)/1000.0) 

Out[154]: 
      A   B   C 
0 -1.705459 0.148671 0.835761 
1 -0.956745 -0.586382 0.213339 
2 0.550368 -0.401651 1.421515 
3 0.348938 0.878923 0.136914 
4 0.270864 0.132864 1.233622 
+0

これは私が尋ねたものではありません。たぶん私は私の質問で十分に明確ではなかった。私はランダムなデータを必要としません、私は小さな平均ゼロの乱数を既存のデータに追加したいと思います。 – TPM

+0

あなたの例は、初期値が '0'であることを示しています。これは同じで、問題をより明確に説明する必要があります。 – EdChum

+0

例えば、' df = pd.DataFrame((np .random.rand(5,3) - 0.5)/1000.0、columns = list( 'ABC')) ' – EdChum

1

:あなたのデータフレームがそのあなたのゼロが含まれている場合については

df + (np.random.rand(df.shape)-0.5)*0.001 

OR

df + np.random.uniform(-0.01,0.01,(df.shape))) 

ゼロとして保存しておきたい:

df * (1 + (np.random.rand(df.shape)-0.5)*0.001) 

OR

df * (1 + np.random.uniform(-0.01,0.01,(df.shape))) 

私はこれらのいずれかが動作するはずだと思う、あなたが既存のものと同じサイズの「データフレーム」(または配列の、おそらく配列)を生成するその場合、 dfとそれをあなたの既存のdfに加えます(ゼロをゼロにしたい場合は1 + randomで乗算します)。ユニフォーム関数を使用すると、0.01変数を変更することでノイズのスケールを決定できます。

関連する問題