熊猫根据在另一列上有条件的随机值样本替换NaN值

朱利安·德拉戈(Julian Drago)

说我有一个像这样的数据框:

import pandas as pd
import numpy as np

np.random.seed(0)

df = {}
df['x'] = np.concatenate([np.random.uniform(0, 5, 4), np.random.uniform(5, 10, 4)])
df['y'] = np.concatenate([[0] * 4, [1] * 4])
df = pd.DataFrame(df)

df.loc[len(df) + 1] = [np.NaN, 0]
df.loc[len(df) + 1] = [np.NaN, 1]
df
Out[232]: 
           x    y
0   2.744068  0.0
1   3.575947  0.0
2   3.013817  0.0
3   2.724416  0.0
4   7.118274  1.0
5   8.229471  1.0
6   7.187936  1.0
7   9.458865  1.0
9        NaN  0.0
10       NaN  1.0

我想要做的是NaN基于基于值的随机样本x填充y值。

例如,在第9行(y为0)中,我想NaN用仅从x值为y0的值中随机抽样的数字代替。实际上,我将从以下列表中抽样:

df[df['y'] == 0]['x'].dropna().values.tolist()
Out[233]: [2.7440675196366238, 3.5759468318620975, 3.0138168803582195, 2.724415914984484]

同样,对于第10行,我将仅基于'x'值(其中y为1而不是0)进行采样。我无法找到以编程方式进行处理的方法(至少,这不是一种不好的做法) ,例如遍历数据框行)。

我咨询过Pandas:使用列值随机抽样替换NaN,这向我展示了如何从列中的所有值中随机抽样,但是我需要随机抽样以另一列的不同值为条件。我还看到了用条件均值(例如this替换NaN的答案,但是我希望随机抽样而不是使用均值。

海盗

transformchoice

我放弃了提高可读性的效率。请注意,我为每一行生成一个随机选择,但只选择我需要填写空值的数字。从理论上讲,我可以做到这样,我只为那些缺失的值选择随机数。

def f(s):
    mask = s.isna()
    return np.where(mask, np.random.choice(s[~mask], len(s)), s)

df.assign(x=df.groupby('y')['x'].transform(f))

           x    y
0   2.744068  0.0  # <━┓
1   3.575947  0.0  #   ┃
2   3.013817  0.0  #   ┃
3   2.724416  0.0  #   ┃
4   7.118274  1.0  #   ┃
5   8.229471  1.0  # <━╋━┓
6   7.187936  1.0  #   ┃ ┃
7   9.458865  1.0  #   ┃ ┃
9   2.744068  0.0  # <━┛ ┃
10  8.229471  1.0  # <━━━┛

稍稍钝一些,但只能根据需要选择。

def f(s):
    out = s.to_numpy().copy()
    mask = s.isna().to_numpy()
    out[mask] = np.random.choice(out[~mask], mask.sum())
    return out

df.assign(x=df.groupby('y')['x'].transform(f))

           x    y
0   2.744068  0.0  # <━┓
1   3.575947  0.0  #   ┃
2   3.013817  0.0  #   ┃
3   2.724416  0.0  #   ┃
4   7.118274  1.0  # <━╋━┓
5   8.229471  1.0  #   ┃ ┃
6   7.187936  1.0  #   ┃ ┃
7   9.458865  1.0  #   ┃ ┃
9   2.744068  0.0  # <━┛ ┃
10  7.118274  1.0  # <━━━┛

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫groupby,在一个列上有条件以填充另一列

根据Pyspark中另一列的值,有条件地从同一列的另一行值替换一行中的值?

有条件地用另一列的值替换列的值perl

根据另一列中的值有条件地计算一列的递归

使用 dplyr 有条件地将列中的值替换为另一列中的值

根据另一列的行值有条件地返回一些行值的向量

使用 VBA 根据另一列的值有条件地插入值时遇到问题

熊猫:根据其他列的值有条件地替换值

有条件地更新依赖于熊猫中另一列的列的值

使用dplyr有条件地将一列中的值替换为另一列中的值

如何使用另一列中的值有条件地更改DF值

如何根据另一列的条件替换一列的NaN值?

熊猫-您可以在跳过行时有条件地在另一列上填充吗?

每行每一列都有条件的随机值(0和1)

熊猫根据另一列中的值替换值

根据R中一列中的连续值有条件地插入行

如何基于对Pyspark中另一列的表达式求值,有条件地替换一列中的值?

当另一列在熊猫中具有特定值时,用 NaN 替换列值

根据熊猫中的日期条件,将一列的值替换为NaN

有条件地将值从一列复制到另一列

如何有条件地将一列填充到列表中另一列中的值?

有条件地将值从R中的一列粘贴到另一列

Pandas DataFrame-按行,有条件地用最后一列值替换多个列值

使用Tidyverse根据另一个数据框列中的值有条件地替换数据框列中的值

Python熊猫根据另一列的条件填充缺失值(NaN)

在列上有条件的熊猫多索引选择

根据另一列中的值,用颜色有条件地填充特定列中的单元格

熊猫基于另一列替换值条件

R:根据另一部分排序值有条件地对一列进行排序