gpt4 book ai didi

python - 为什么在这种情况下 df.sample 和 df.apply 的工作方式不同?

转载 作者:行者123 更新时间:2023-12-01 01:50:05 25 4
gpt4 key购买 nike

假设我有一个想要采样的数据框

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(100,2)),columns=list('AB'))

如果我们有

s = df.sample(5)
print(s)

我们得到一个长度为 5 的帧,这向我表明它是随机采样的索引,然后返回每一行。

但是,如果我运行

 t = df.apply(lambda x: x.sample(5))
print(t)

我得到一个长度为 10 的帧,每列被采样 5 次,并且数据帧在没有关联样本的单元格中返回 NaN。为什么这两个函数的行为不同?我希望它们是相同的?

看起来df.sample(5)相当于

 df.apply(lambda x: np.random.choice(x,5))

现在如果我对数据框进行分组。

g = df.groupby('A')

然后g.apply(lambda x: x.sample(2))给了我我想要的(每组中随机抽取2个样本),但应用了与之前相同的等价性

 g.apply(lambda x: np.random.choice(x,2))

给我一​​个ValueError。这是为什么?

最佳答案

.sample 默认情况下将在调用时使用随机种子(如果未指定,则使用随机种子)。

当您执行 df.sample(5) 时,您将根据单个种子随机抽取 5 行。但是,当您执行 t = df.apply(lambda x: x.sample(5)) 时,将为每次调用 .sample 生成一个新种子(例如,每一列都有不同的索引),结果将是 N 行,表示采样的唯一索引的数量(在您的示例中可能是 10,但也可能更少)。

您可以通过指定样本的random_state参数来强制所有调用使用相同的随机序列,例如:

df.apply(lambda x: x.sample(5, random_state=42))

这给你:

    A  B
83 8 3
53 7 3
70 7 2
45 3 8
44 1 1

这与 df.sample(5, random_state=42) 为您提供的内容相同。

关于python - 为什么在这种情况下 df.sample 和 df.apply 的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50813719/

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