2017-05-04 39 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

爲什麼不只是'df = pd.DataFrame(np.random.randn(3,5),columns = list('ABC'))'這裏'-0.5/1000.0'的意義是什麼 – EdChum

+0

這樣' df.apply(lambda 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,只是爲了檢查你的第一個解決方案爲數據框的每個元素添加相同的隨機數,而你的第二個解決方案爲df中的每個值添加一個單獨的隨機數? – tfcoe

+0

@tfcoe你是對的。讓我們稍微修改第一條語句。它是固定的。 –

3

這將是更簡潔的方法和等效:

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 

如果你這樣做是與非零值現有的DF然後add

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 +隨機值)。通過統一的功能,您可以通過更改0.01變量來確定噪音的大小。

相關問題