我有一个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()))
但它不起作用。你能帮我实现吗?最好的祝福。
您可以使用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值的列。
这是在对第一个答案进行改进之后对这个问题的另一种方法,并根据如何检查numpy int是否nand在numpy文档中找到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)
这对我在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
这是另一个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