Fan*_*ang 4 python random normal-distribution pandas
我最近一直在玩熊猫,现在我尝试用不同的正态分布随机值替换数据框中的NaN值。
假设我有这个没有标题的CSV文件
0
0 343
1 483
2 101
3 NaN
4 NaN
5 NaN
Run Code Online (Sandbox Code Playgroud)
我的预期结果应该是这样的
0
0 343
1 483
2 101
3 randomnumber1
4 randomnumber2
5 randomnumber3
Run Code Online (Sandbox Code Playgroud)
但是我得到了以下内容:
0
0 343
1 483
2 101
3 randomnumber1
4 randomnumber1
5 randomnumber1 # all NaN filled with same number
Run Code Online (Sandbox Code Playgroud)
到目前为止我的代码
import numpy as np
import pandas as pd
df = pd.read_csv("testfile.csv", header=None)
mu, sigma = df.mean(), df.std()
norm_dist = np.random.normal(mu, sigma, 1)
for i in norm_dist:
print df.fillna(i)
Run Code Online (Sandbox Code Playgroud)
我正在考虑从数据框中获取NaN行的数量,并用np.random.normal(mu, sigma, 1)NaN行的总数替换数字1,以便每个NaN可能具有不同的值。
但是我想问一下是否还有其他简单的方法可以做到这一点?
感谢您的帮助和建议。
这是处理基础数组数据的一种方法-
def fillNaN_with_unifrand(df):
a = df.values
m = np.isnan(a) # mask of NaNs
mu, sigma = df.mean(), df.std()
a[m] = np.random.normal(mu, sigma, size=m.sum())
return df
Run Code Online (Sandbox Code Playgroud)
本质上,我们使用大小参数withnp.random.normal与NaN的计数一次性生成所有随机数,并再次与NaN的掩码一次性分配它们。
样品运行-
In [435]: df
Out[435]:
0
0 343.0
1 483.0
2 101.0
3 NaN
4 NaN
5 NaN
In [436]: fillNaN_with_unifrand(df)
Out[436]:
0
0 343.000000
1 483.000000
2 101.000000
3 138.586483
4 223.454469
5 204.464514
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |