如何使用熊猫用不同的随机值替换列中的每个NaN?

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可能具有不同的值。

但是我想问一下是否还有其他简单的方法可以做到这一点?

感谢您的帮助和建议。

Div*_*kar 5

这是处理基础数组数据的一种方法-

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)