numpy 带有np.random.choice的输出不正确

8yoxcaq7  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(215)

我尝试使用np. random. choice从17mm Dataframe 中随机选择记录,因为与其他方法相比,它运行速度更快,但我在每个记录的输出中得到不正确的值...示例如下:

data = {
  "calories":[420,380,390,500,200,100],
  "Duration":[50,40,45,600,450,210],
  "Id":[1,1 2,3,2,3],
  "Yr":[2003,2003,2009,2003,2012,2003],
  "Mth":[3,6,9,12,3,6],
}
df = PD.dataframe(data)

df2=df.groupby(['id','yr'],as_index=False).agg(np.random.choice)

输出:

Id yr   calories    duration    mth
1  2003    420    50    6
2  2009    390    45    9
2  2012    200    450   3
3  2003    500    210   6

输出中的问题是Id 3的卡路里500,持续时间和mth应该是600和12而不是210和6 ...有人能帮助为什么它是从不同的行选择值吗?
预期产出:
随机选择后应保留相同的行值

ffdz8vbo

ffdz8vbo1#

这不起作用,因为Pandas在每列上独立应用聚合,请尝试放入print语句,例如:

def fn(x):
  print(x)
  return np.random.choice(x)

df.groupby(['id','yr'],as_index=False).agg(fn)

可以让你看到函数是什么时候被调用的,以及调用的对象是什么。
我不是Pandas方面的Maven,但使用GroupBy.apply似乎是我发现的保持行在一起的最简单的方法。
如下所示:

import pandas as pd
import numpy as np

df = pd.DataFrame({
  "calories":[420,380,390,500,200,100],
  "duration":[50,40,45,600,450,210],
  "id":[1,1,2,3,2,3],
  "yr":[2003,2003,2009,2003,2012,2003],
  "mth":[3,6,9,12,3,6],
})

df.groupby(['id', 'yr'], as_index=False).apply(lambda x: x.sample(1))

产生:

calories  duration  id    yr  mth
0 1       380        40   1  2003    6
1 2       390        45   2  2009    9
2 4       200       450   2  2012    3
3 5       100       210   3  2003    6

开头的两个数字是因为你最终得到了一个多索引。如果你想知道行是从哪里选择的,这将包含有用的信息,否则你可以放弃索引。
请注意,文档中有警告说,这可能不是很好的性能,但不知道细节。
更新:我刚刚阅读了更多的文档,注意到有一个GroupBy.sample方法,所以您可以改为:

df.groupby(['id', 'yr']).sample(1)

这大概是性能以及要短得多!

相关问题