python - Pandas:使用列值的随机采样替换 NaN

标签 python pandas

我有一个 DataFrame,df,包含多个列。 df 中的某些值是 NaN。我想用一个有效值替换每个 NaN,该值是从给定列中的其他值中随机抽取的。

例如,如果:

df[work] = [4, 7, NaN, 4]

我想用 4 2/3 的时间和 7 1/3 的时间替换 df[work][2]

这是我的尝试:

def resample_fillna(df):
    for col in df.columns:
        # get series consisting of non-NaN values
        valid_series = df[col].dropna()
        nan_indices = np.argwhere(np.isnan(df[col]))
        for nan_index in nan_indices:
            df[col][nan_index] = valid_series.sample(n=1)

我认为有更好、更 Pythonic 的方法。有什么想法吗?

谢谢!

最佳答案

让我们创建一些假数据,然后用同一列中的其他随机值填充缺失值。

np.random.seed(123)
data = np.random.randint(0, 10, (10,5))
df = pd.DataFrame(data, columns=list('abcde'))
df = df.where(df > 2)
df

     a    b    c    d    e
0  NaN  NaN  6.0  NaN  3.0
1  9.0  6.0  NaN  NaN  NaN
2  9.0  NaN  NaN  9.0  3.0
3  4.0  NaN  NaN  4.0  NaN
4  7.0  3.0  NaN  4.0  7.0
5  NaN  4.0  8.0  NaN  7.0
6  9.0  3.0  4.0  6.0  NaN
7  5.0  6.0  NaN  NaN  8.0
8  3.0  5.0  NaN  NaN  6.0
9  NaN  4.0  4.0  6.0  3.0

现在我们可以使用 apply 遍历每一列并从非缺失值中进行替换采样。

df.apply(lambda x: np.where(x.isnull(), x.dropna().sample(len(x), replace=True), x))

     a    b    c    d    e
0  5.0  3.0  6.0  6.0  3.0
1  9.0  6.0  4.0  9.0  7.0
2  9.0  5.0  8.0  9.0  3.0
3  4.0  3.0  8.0  4.0  6.0
4  7.0  3.0  4.0  4.0  7.0
5  9.0  4.0  8.0  6.0  7.0
6  9.0  3.0  4.0  6.0  3.0
7  5.0  6.0  4.0  4.0  8.0
8  3.0  5.0  4.0  4.0  6.0
9  9.0  4.0  4.0  6.0  3.0

关于python - Pandas:使用列值的随机采样替换 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384934/

相关文章:

python - Pandas:将每组的前 2 小时设置为 NaN

python - 如何在 Pandas 中做 'lateral view explode()'

基于数据集中先前数字的 Pandas DataFrame 编号

python - 如何在 Python 中为 argparse 设置自定义输出处理程序?

python - 单选按钮重定向 url 不起作用

python - 使用 BeautifulSoup/Python 提取网站背景图像的 URL

python - pd.DataFrame 在单列中打印输出

python - 如何在日期时间索引上加入两个数据帧,使用 nan 自动填充不匹配的行

python - 为什么我只能从 statsmodels OLS 拟合中获得一个参数

python - 如何在 mac os x 上使用带有 python3.8 而不是 python3.9 的 Gunicorn?