如何在具有从指定正态分布中随机选择的值的数据帧中归纳NA

时间:2018-01-12 08:50:13

标签: python pandas imputation

如何在具有从指定正态分布中随机选择的值的数据帧中归纳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无法填充模拟数组。 我怎样才能完成这项工作。谢谢。

1 个答案:

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

首先,您必须找到空白字段。最简单的是使用.stackpd.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