随机选择 DF 的特定值

2024-04-01

我有一个很大的 df,有 17520 行和 1000 列。 df 只有两个值 [0,0.05]。我想转到 df 的值为 0.05 的每个单元格并将其更改为随机值。随机值只能是0或0.05。

我尝试了以下代码行:

 y = np.array([0,0.05])
 df.replace(0.05,np.random.choice(y))

但是,它对值为 0.05 的所有单元格执行相同的随机选择,并且我希望为值为 0.05 的每个单元格执行不同的随机选择。我尝试了 for 循环,但是花费了太多时间,大约 20 分钟。我需要重复这个实验大约100次。
因此,我想知道是否有更有效的方法来做到这一点。

我将不胜感激你的帮助。


您可以使用而不是循环df.update() https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.update.html像这样,获得 >20 倍的加速:

df = pd.DataFrame(np.random.choice([0, 0.05], size=(4000, 1000)))
 %timeit df.update(np.random.choice([0, 0.05], size=df.shape), filter_func=lambda x: x==0.05)
#498 ms ± 19.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
df = pd.DataFrame(np.random.choice([0, 0.05], size=(4000, 1000)))
%timeit df.applymap(lambda x: np.random.choice([0, 0.05]) if x == 0.05 else 0)
#9.66 s ± 634 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我注意到速度只会随着越来越大的数据帧而增加,但这里 applymap 已经花费了很长时间,因此我决定不再进一步增加数据帧大小。

怎么运行的

df = pd.DataFrame(np.random.choice([0, 0.05], size=(1000, 1000)))
print(df.tail(2))
df.update(np.random.choice([0, 0.05], size=df.shape), filter_func=lambda x: x==0.05)
print(df.tail(2))
#      0     1     2    3     4     5   ...   994   995   996   997   998  999
#998  0.00  0.05  0.05  0.0  0.05  0.05 ...   0.0  0.05  0.05  0.05  0.05  0.0
#999  0.05  0.00  0.05  0.0  0.05  0.05 ...   0.0  0.05  0.05  0.05  0.00  0.0
#
#[2 rows x 1000 columns]
#      0     1     2    3     4     5   ...   994   995   996  997   998  999
#998  0.00  0.05  0.00  0.0  0.05  0.05 ...   0.0  0.05  0.05  0.0  0.05  0.0
#999  0.05  0.00  0.05  0.0  0.05  0.00 ...   0.0  0.00  0.05  0.0  0.00  0.0
#
#[2 rows x 1000 columns]

With update,您可以更改 DataFrame 中选定的值。选择值(默认np.nan) use filter_func= lambda x: x==0.05然后创建一个与原始 DataFrame 大小相同的 DataFrame,其中随机选择[0, 0.05]。然后它从原始 DataFrame 中选择值0.05并将其替换为随机值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机选择 DF 的特定值 的相关文章

随机推荐