说我有一个像这样的数据框:
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
值为y
0的值中随机抽样的数字代替。实际上,我将从以下列表中抽样:
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的答案,但是我希望随机抽样而不是使用均值。
transform
与 choice
我放弃了提高可读性的效率。请注意,我为每一行生成一个随机选择,但只选择我需要填写空值的数字。从理论上讲,我可以做到这样,我只为那些缺失的值选择随机数。
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] 删除。
我来说两句