Python 熊猫。根据变量分布替换NAN值

Python 熊猫。根据变量分布替换NAN值,python,pandas,dataframe,null,Python,Pandas,Dataframe,Null,考虑到分布情况,我需要替换列中的nan值。这些值的标准化频率为0.5879336282383848、0.37367433995536975和0.03839203180624546。 我打算做一些类似的事情: for idx in nan_cols: if random() < 0.03839203180624546: df[idx][col] = 0 elif random() < 0.03839203180624546 + 0.3736743399

考虑到分布情况,我需要替换列中的nan值。这些值的标准化频率为0.5879336282383848、0.37367433995536975和0.03839203180624546。 我打算做一些类似的事情:

for idx in nan_cols:
    if random() < 0.03839203180624546:
         df[idx][col] = 0
    elif random() < 0.03839203180624546 + 0.37367433995536975:
         df[idx][col] = 1
    else:
         df[idx][col] = 2
nan_cols中idx的
:
如果随机()
df[idx][col]=0
elif random()<0.03839203180624546+0.37367433995536975:
df[idx][col]=1
其他:
df[idx][col]=2

我想一定有pandas的方法或者我缺少的东西。

如果我理解了这个问题,你有一个包含一些空数据的数据框,你想用以某种已知方式分布的值来替换它

下面的方法使用了
DataFrame.stack
DataFrame.unstack
方法以及
pd.cut
,满足了您的需要

首先,生成一些表示您的问题的虚拟数据(这里我们有一个10x3的数据框,由随机数据填充,
np.nan
值插入到随机位置):

这将生成如下内容:

print(data)

       col0      col1      col2
0  0.415485       NaN       NaN
1       NaN       NaN  0.799004
2       NaN  0.359693       NaN
3       NaN       NaN  0.536442
4  0.733635       NaN       NaN
5       NaN       NaN       NaN
6  0.574215       NaN       NaN
7       NaN  0.949404       NaN
8       NaN  0.384289  0.633768
9  0.607698  0.266648  0.639140
我们要做的是,根据[0,1]上关于以下频率的均匀分布,用0、1或2填充这些
np.nan
值:

freqs = 0.03839203180624546, 0.37367433995536975, 0.5879336282383848
为此,我们先堆叠、剪切,然后取消堆叠:

stacked = data.copy().stack(dropna=False)
stacked[stacked.isnull()] = \
            pd.cut(np.random.random(stacked.isnull().sum()), 
                   np.cumsum(np.insert(freqs,0,0.)), labels=(0,1,2))
result = stacked.unstack()
这使得:

print(result)

       col0      col1      col2
0  0.415485  2.000000  2.000000
1  2.000000  2.000000  0.799004
2  1.000000  0.359693  2.000000
3  1.000000  2.000000  0.536442
4  0.733635  0.000000  1.000000
5  2.000000  2.000000  2.000000
6  0.574215  2.000000  2.000000
7  1.000000  0.949404  2.000000
8  2.000000  0.384289  0.633768
9  0.607698  0.266648  0.639140

如果我理解了这个问题,那么您有一个包含一些空数据的数据框,您希望用以某种已知方式分布的值替换这些空数据

下面的方法使用了
DataFrame.stack
DataFrame.unstack
方法以及
pd.cut
,满足了您的需要

首先,生成一些表示您的问题的虚拟数据(这里我们有一个10x3的数据框,由随机数据填充,
np.nan
值插入到随机位置):

这将生成如下内容:

print(data)

       col0      col1      col2
0  0.415485       NaN       NaN
1       NaN       NaN  0.799004
2       NaN  0.359693       NaN
3       NaN       NaN  0.536442
4  0.733635       NaN       NaN
5       NaN       NaN       NaN
6  0.574215       NaN       NaN
7       NaN  0.949404       NaN
8       NaN  0.384289  0.633768
9  0.607698  0.266648  0.639140
我们要做的是,根据[0,1]上关于以下频率的均匀分布,用0、1或2填充这些
np.nan
值:

freqs = 0.03839203180624546, 0.37367433995536975, 0.5879336282383848
为此,我们先堆叠、剪切,然后取消堆叠:

stacked = data.copy().stack(dropna=False)
stacked[stacked.isnull()] = \
            pd.cut(np.random.random(stacked.isnull().sum()), 
                   np.cumsum(np.insert(freqs,0,0.)), labels=(0,1,2))
result = stacked.unstack()
这使得:

print(result)

       col0      col1      col2
0  0.415485  2.000000  2.000000
1  2.000000  2.000000  0.799004
2  1.000000  0.359693  2.000000
3  1.000000  2.000000  0.536442
4  0.733635  0.000000  1.000000
5  2.000000  2.000000  2.000000
6  0.574215  2.000000  2.000000
7  1.000000  0.949404  2.000000
8  2.000000  0.384289  0.633768
9  0.607698  0.266648  0.639140