Python 熊猫。根据变量分布替换NAN值
考虑到分布情况,我需要替换列中的nan值。这些值的标准化频率为0.5879336282383848、0.37367433995536975和0.03839203180624546。 我打算做一些类似的事情: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
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