为pandas数据帧中的每个单元格添加一个不同的随机数

时间:2017-05-04 15:54:27

标签: python pandas dataframe

我需要为我的数据添加一些'噪音',所以我想为我的pandas数据帧中的每个单元添加一个不同的随机数。这段代码有效,但似乎是单声道的。还有更好的方法吗?

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

3 个答案:

答案 0 :(得分:8)

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

OR

让我们使用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],...  

答案 1 :(得分:4)

这将是更简洁的方法和等效方法:

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

答案 2 :(得分:2)

对于非零数据:

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)))

我认为其中任何一个都应该有用,它是一个生成相同大小的情况" dataframe" (或者可能是数组数组)作为现有的df并将其添加到现有的df中(对于希望零保持为零的情况,乘以1 +随机)。使用统一功能,您可以通过更改0.01变量来确定噪声的大小。