我有一个带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)]
当我使用带有随机数值数据的数据框执行上述操作时,上述脚本运行正常。
答案 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())