如何在具有从指定正态分布中随机选择的值的数据帧中归纳NA。 数据帧df定义如下:
A B C D
1 3 NA 4 NA
2 3.4 2.3 4.1 NA
3 2.3 0.1 0.2 6.3
4 3.1 4.5 2.1 0.2
5 4.1 2.5 NA 2.4
我想用从生成的正态分布中随机选择的值填充NA,并且值不同。 正态分布的平均值是给定数据帧的值的1%分位数。标准偏差是数据帧中行的中位数SD。
我的代码如下:
import pandas as pd
import numpy as np
df = pd.read_csv('try.txt',sep="\t")
df.index = df['type']
del df['type']
sigma = median(df.std(axis=1))
mu = df.quantile(0.01)
# mean and standard deviation
df = df.fillna(np.random.normal(mu, sigma, 1))
均值不正确,df无法填充模拟数组。 我怎样才能完成这项工作。谢谢。
答案 0 :(得分:1)
您的代码存在一些问题
df.index = df['type']
del df['type']
可以更好地表达为df.set_index('type')
median(df.std(axis=1))
应为df.std(axis=1).median()
df.quantile()
返回一个系列。如果您想要所有值的分位数,您应该df.stack().quantile(0.01)
sigma = df.std(axis=1).median()
mu = df.stack().quantile(0.01)
print((sigma, mu))
(0.9539392014169454, 0.115)
首先,您必须找到空白字段。最简单的是使用.stack
和pd.isnull
df2 = df.stack(dropna=False)
s = df2[pd.isnull(df2)]
现在你可以用两种方式估算随机值
ran = np.random.normal(mu, sigma, len(s))
df3 = df.stack(dropna=False)
df3.loc[s.index] = ran
df3.unstack()
A B C D 1 3.0 0.38531116198179066 4.0 0.7070154252582993 2 3.4 2.3 4.1 -0.8651789931843614 3 2.3 0.1 0.2 6.3 4 3.1 4.5 2.1 0.2 5 4.1 2.5 -1.3176599584973157 2.4
或通过循环覆盖原始DataFrame
for (row, column), value in zip(s.index.tolist(), np.random.normal(mu, sigma, len(s))):
df.loc[row, column] = value