如何使用从指定正态分布中随机选择的值来估算数据框中的 NA
How can I impute the NA in a dataframe with values randomly selected from a specified normal distribution
如何使用从指定正态分布中随机 selected 的值来估算数据框中的 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
我想用生成的正态分布中随机 select 的值填充 NA,但这些值不同。
正态分布的均值是给定数据帧值的 1% 分位数。标准差是数据框中各行的标准差中位数。
我的代码如下:
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不能用模拟数组填充。
我怎样才能完成工作。谢谢。
您的代码存在一些问题
df.index = df['type']
del df['type']
可以更好地表示为df.set_index('type')
median(df.std(axis=1))
应该是 df.std(axis=1).median()
df.quantile()
returns一个系列。如果你想要所有值的分位数,你应该做 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
如何使用从指定正态分布中随机 selected 的值来估算数据框中的 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
我想用生成的正态分布中随机 select 的值填充 NA,但这些值不同。 正态分布的均值是给定数据帧值的 1% 分位数。标准差是数据框中各行的标准差中位数。
我的代码如下:
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不能用模拟数组填充。 我怎样才能完成工作。谢谢。
您的代码存在一些问题
df.index = df['type']
del df['type']
可以更好地表示为df.set_index('type')
median(df.std(axis=1))
应该是 df.std(axis=1).median()
df.quantile()
returns一个系列。如果你想要所有值的分位数,你应该做 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