用随机值替换数据框中的NaN

时间:2015-06-04 14:54:08

标签: python pandas

我有一个带NaN值的数据框(data_train),下面给出了一个样本:

republican                n                          y   
republican                n                          NaN   
democrat                 NaN                         n
democrat                  n                          y   

我想用一些随机值替换所有NaN,如。

republican                n                           y   
republican                n                          rnd2
democrat                 rnd1                         n
democrat                  n                           y   

我该怎么做。

我尝试了以下内容,但没有运气:

df_rand = pd.DataFrame(np.random.randn(data_train.shape[0],data_train.shape[1]))
data_train[pd.isnull(data_train)] = dfrand[pd.isnull(data_train)]

当我使用带有随机数值数据的数据框执行上述操作时,上述脚本运行正常。

7 个答案:

答案 0 :(得分:3)

好吧,如果您使用fillna填充NaN,则随机生成器只能运行一次,并使用相同的数字填充所有N / As。

因此,请确保每次都生成并使用随机数。 对于像这样的数据框:

          Date         A       B
0   2015-01-01       NaN     NaN
1   2015-01-02       NaN     NaN
2   2015-01-03       NaN     NaN
3   2015-01-04       NaN     NaN
4   2015-01-05       NaN     NaN
5   2015-01-06       NaN     NaN
6   2015-01-07       NaN     NaN
7   2015-01-08       NaN     NaN
8   2015-01-09       NaN     NaN
9   2015-01-10       NaN     NaN
10  2015-01-11       NaN     NaN
11  2015-01-12       NaN     NaN
12  2015-01-13       NaN     NaN
13  2015-01-14       NaN     NaN
14  2015-01-15       NaN     NaN
15  2015-01-16       NaN     NaN

我使用以下代码填写A列中的NaNs

import random
x['A'] = x['A'].apply(lambda v: random.random() * 1000)

这会给我们提供类似的东西:

          Date           A       B
0   2015-01-01   96.538211     NaN
1   2015-01-02  404.683392     NaN
2   2015-01-03  849.614253     NaN
3   2015-01-04  590.030660     NaN
4   2015-01-05  203.167519     NaN
5   2015-01-06  980.508258     NaN
6   2015-01-07  221.088002     NaN
7   2015-01-08  285.013762     NaN

答案 1 :(得分:0)

您可以这样使用pandas update命令:

1)生成一个随机DataFrame,其列和索引与原始列相同:

// 1, 2, 3
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.error)
generator.notificationOccurred(.success)
generator.notificationOccurred(.warning)

// 4
let generator = UIImpactFeedbackGenerator(style: .light)
generator.impactOccurred()

// 5
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccurred()

// 6
let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()

// 7
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()

2)然后使用import numpy as np; import pandas as pd M = len(df.index) N = len(df.columns) ran = pd.DataFrame(np.random.randn(M,N), columns=df.columns, index=df.index) ,以便update中的NaN值将被生成的随机值替换

df

在上面的示例中,我使用了标准法线中的值,但您也可以使用从原始DataFrame中随机选取的值:

df.update(ran)

答案 2 :(得分:0)

如果您想用热甲板技术替换色谱柱中的NaN,我可以这样建议:​​

def hot_deck(dataframe) :
    dataframe = dataframe.fillna(0)
    for col in dataframe.columns :
        assert (dataframe[col].dtype == np.float64) | (dataframe[col].dtype == np.int64)
        liste_sample = dataframe[dataframe[col] != 0][col].unique()
        dataframe[col] = dataframe.apply(lambda row : random.choice(liste_sample) if row[col] == 0 else row[col],axis=1)
    return dataframe

如果你更喜欢用每个迭代的新随机值替换NaN,你可以做这样的事情。 您只需确定随机选择的最大值即可。

def hot_deck(dataframe,max_value) :
    dataframe = dataframe.fillna(0)
    for col in dataframe.columns :
        assert (dataframe[col].dtype == np.float64) | (dataframe[col].dtype == np.int64)
        liste_sample = random.sample(range(max_value),dataframe.isnull().sum())
        dataframe[col] = dataframe.apply(lambda row : random.choice(liste_sample) if row[col] == 0 else row[col],axis=1)
    return dataframe

答案 3 :(得分:0)

如果要将DF中的所有NaN替换为列表中的随机值,可以执行以下操作:

import numpy as np

df.applymap(lambda l: l if not np.isnan(l) else np.random.choice([1, 3]))

答案 4 :(得分:0)

在循环中使用fillna()并将'limit'属性设置为1可以帮助将nan替换为不同的随机值。

import random
while(Series.isnull().sum()!=0):
    Series.fillna(random.uniform(0,100),inplace=True,limit=1)

答案 5 :(得分:0)

您可以使用#tilde 运算符随机填充值

df['column'].dropna()
df["column"].fillna(np.random.choice(df['column'][~df['column'].isna()]),inplace = True)

答案 6 :(得分:-1)

以这种方式使用fillna

import random
data_train.fillna(random.random())