如何通过从另一个数据帧中随机选择来创建数据帧?

问题描述

DP 1      DP 2    DP 3     DP 4     DP 5     DP 6     DP 7     DP 8    DP 9    DP 10
(0.519)  (1.117)  (1.152)   0.772       1.490    (0.850)  (1.189)  (0.759)      
0.030    0.047     0.632   (0.608)     (0.322)   0.939     0.346    0.651       
1.290    (0.179)   0.006    0.850      (1.141)   0.758     0.682            
1.500    (1.228)   1.840   (1.594)     (0.282)   (0.907)                
(1.540)  0.689    (0.683)   0.005   0.543                   
(0.197)  (0.664)  (0.636)   0.878                       
(0.942)  0.764    (0.137)                           
0.693    1.647                              
0.197

我有上面的数据框:

我需要使用来自上面数据框的随机值下面的数据框:

 DP 1       DP 2      DP 3    DP 4         DP 5     DP 6      DP 7     DP 8        DP 9   DP 10
     (0.664)    1.290    0.682    0.030      (0.683)  (0.636)    (0.683)   1.840     (1.540)    
     1.490     (0.907)   (0.850) (0.197)     (1.228)   0.682     1.290     0.939        
     0.047      0.682    0.346    0.689      (0.137)   1.490     0.197          
     0.047      0.878    0.651    0.047      0.047    (0.197)               
     (1.141)    0.758    0.878    1.490      0.651                  
     1.647      1.490    0.772    1.490                         
     (0.519)    0.693    0.346                          
     (0.137)    0.850                               
     0.197 

我试过这个代码

df2= df1.sample(len(df1))

打印(df2)

但是输出

     DP1       DP2       DP3       DP4       DP5       DP6       DP7       DP8  DP9
    OP8   0.735590  1.762630       NaN       NaN       NaN       NaN       NaN       NaN  NaN
    OP7  -0.999665  0.817949 -0.147698       NaN       NaN       NaN       NaN       NaN  NaN
    OP2   0.031430  0.049994  0.682040 -0.667445 -0.360034  1.089516  0.426642  0.916619  NaN
    OP3   1.368955 -0.191781  0.006623  0.932736 -1.277548  0.880056  0.841018       NaN  NaN
    OP1  -0.551065 -1.195305 -1.243199  0.847178  1.668630 -0.986300 -1.465904 -1.069986  NaN
    OP4   1.592201 -1.314628  1.985683 -1.749389 -0.315828 -1.052629       NaN       NaN  NaN
    OP6  -0.208647 -0.710424 -0.686654  0.963221       NaN       NaN       NaN       NaN  NaN
    OP10       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN  NaN
    OP9   0.209244       NaN       NaN       NaN       NaN       NaN       NaN       NaN  NaN
    OP5  -1.635306  0.737937 -0.736907  0.005545  0.607974       NaN       NaN       NaN  NaN

解决方法

您可以使用 np.random.choice() 进行采样。

假设 df 是这样的:

df = pd.DataFrame({'DP 1': ['(0.519)','0.030','1.290','1.500','(1.540)','(0.197)','(0.942)','0.693','0.197'],'DP 2': ['(1.117)','0.047','(0.179)','(1.228)','0.689','(0.664)','0.764','1.647',np.nan],'DP 3': ['(1.152)','0.632','0.006','1.840','(0.683)','(0.636)','(0.137)',np.nan,'DP 4': ['0.772','(0.608)','0.850','(1.594)','0.005','0.878','DP 5': ['1.490','(0.322)','(1.141)','(0.282)','0.543','DP 6': ['(0.850)','0.939','0.758','(0.907)','DP 7': ['(1.189)','0.346','0.682','DP 8': ['(0.759)','0.651','DP 9': [np.nan,'DP 10': [np.nan,np.nan]})

#       DP 1     DP 2     DP 3     DP 4     DP 5     DP 6     DP 7     DP 8     DP 9    DP 10
# 0  (0.519)  (1.117)  (1.152)    0.772    1.490  (0.850)  (1.189)  (0.759)      NaN      NaN
# 1    0.030    0.047    0.632  (0.608)  (0.322)    0.939    0.346    0.651      NaN      NaN
# 2    1.290  (0.179)    0.006    0.850  (1.141)    0.758    0.682      NaN      NaN      NaN
# 3    1.500  (1.228)    1.840  (1.594)  (0.282)  (0.907)      NaN      NaN      NaN      NaN
# 4  (1.540)    0.689  (0.683)    0.005    0.543      NaN      NaN      NaN      NaN      NaN
# 5  (0.197)  (0.664)  (0.636)    0.878      NaN      NaN      NaN      NaN      NaN      NaN
# 6  (0.942)    0.764  (0.137)      NaN      NaN      NaN      NaN      NaN      NaN      NaN
# 7    0.693    1.647      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN
# 8    0.197      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN

首先从 choices 的所有非空值中提取 df

choices = df.values[~pd.isnull(df.values)]

# array(['(0.519)','(1.117)','(1.152)','0.772','1.490','(0.850)',#        '(1.189)','(0.759)',#        '(0.322)',#        '0.850',#        '(1.594)',#        '0.005',#        '(0.942)',#       dtype=object)

然后从 choices 中为所有非空单元格取一个 np.random.choice()

df = df.applymap(lambda x: np.random.choice(choices) if not pd.isnull(x) else x)

#       DP 1     DP 2     DP 3     DP 4     DP 5     DP 6     DP 7     DP 8     DP 9    DP 10
# 0  (0.179)    0.682    0.758  (1.152)  (0.137)  (1.152)    0.939  (0.759)      NaN      NaN
# 1    1.500  (1.152)  (0.197)    0.772    1.840    1.840    0.772  (0.850)      NaN      NaN
# 2    0.878    0.005  (1.540)    0.764  (0.519)    0.682  (1.152)      NaN      NaN      NaN
# 3    0.758  (0.137)    1.840    1.647    1.647  (0.942)      NaN      NaN      NaN      NaN
# 4    0.693  (0.683)  (0.759)    1.500  (0.197)      NaN      NaN      NaN      NaN      NaN
# 5    0.006  (0.137)    0.764  (1.117)      NaN      NaN      NaN      NaN      NaN      NaN
# 6  (0.664)    0.632  (1.141)      NaN      NaN      NaN      NaN      NaN      NaN      NaN
# 7    0.543  (0.664)      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN
# 8  (0.137)      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN