gpt4 book ai didi

python - Pandas 根据另一列条件下的值的随机样本替换 NaN 值

转载 作者:行者123 更新时间:2023-12-02 06:09:14 24 4
gpt4 key购买 nike

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

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

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

例如,在第 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: Replace NaN Using Random Sampling of Column Values ,它向我展示了如何从列中的所有值中随机采样,但我需要随机样本以另一列的不同值为条件。我还看到了用条件平均值 ( such as this ) 替换 NaN 的答案,但我希望随机采样,而不是使用平均值。

最佳答案

转换选择

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

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 # <━━━┛

关于python - Pandas 根据另一列条件下的值的随机样本替换 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59992059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com