我有一个pandas数据框,其中有几个缺失值。我注意到非缺失值彼此接近。因此,我想通过随机选择非缺失值来估算缺失值。
例如:
import pandas as pd
import random
import numpy as np
foo = pd.DataFrame({'A': [2, 3, np.nan, 5, np.nan], 'B':[np.nan, 4, 2, np.nan, 5]})
foo
A B
0 2 NaN
1 3 4
2 NaN 2
3 5 NaN
4 NaN 5
我希望例如foo['A'][2]=2
和foo['A'][5]=3
我的pandas DataFrame的形状是(6940,154)。
我试试这个
foo['A'] = foo['A'].fillna(random.choice(foo['A'].values.tolist()))
但它不起作用。你能帮我实现吗?最好的问候。
答案 0 :(得分:3)
您可以使用pandas.fillna方法和random.choice方法通过随机选择特定列来填充缺失值。
import random
import numpy as np
df["column"].fillna(lambda x: random.choice(df[df[column] != np.nan]["column"]), inplace =True)
其中column是要随机填充非nan值的列。
答案 1 :(得分:3)
这是对第一个答案进行改进之后的另一种方法,并根据如何在numpy文档中检查numpy int是否为n here
foo['A'].apply(lambda x: np.random.choice([x for x in range(min(foo['A']),max(foo['A'])]) if (np.isnan(x)) else x)
答案 2 :(得分:2)
我这样做是为了用随机的非 NaN 值填充 NaN 值:
import random
df['column'].fillna(random.choice(df['column'][df['column'].notna()]), inplace=True)
答案 3 :(得分:1)
这适用于Pandas DataFrame
def randomiseMissingData(df2):
"randomise missing data for DataFrame (within a column)"
df = df2.copy()
for col in df.columns:
data = df[col]
mask = data.isnull()
samples = random.choices( data[~mask].values , k = mask.sum() )
data[mask] = samples
return df
答案 4 :(得分:1)
这是另一个Pandas DataFrame方法
import numpy as np
def fill_with_random(df2, column):
'''Fill `df2`'s column with name `column` with random data based on non-NaN data from `column`'''
df = df2.copy()
df[column] = df[column].apply(lambda x: np.random.choice(df[column].dropna().values) if np.isnan(x) else x)
return df
答案 5 :(得分:0)
对我来说只有这个有效,上面的所有例子都失败了。 有些填了相同的数字,有些什么都不填。
def fill_sample(df, col):
tmp = df[df[col].notna()[col].sample(len(df[df[col].isna()])).values
k = 0
for i,row in df[df[col].isna()].iterrows():
df.at[i, col] = tmp[k]
k+=1
return df