Python: 按组随机选择

69 投票
12 回答
59026 浏览
提问于 2025-04-17 22:46

假设我有一个数据表,长得像这样:

Name Group_Id
AAA  1
ABC  1
CCC  2
XYZ  2
DEF  3 
YYH  3

我该如何从每个Group_Id中随机选择一行(或者多行)呢?比如说,我想从每个Group_Id中随机抽取一行,那我会得到:

Name Group_Id
AAA  1
XYZ  2
DEF  3

12 个回答

11

用一行代码优雅地结合了groupby和random.choice:

df.groupby('Group_Id').apply(lambda x :x.iloc[random.choice(range(0,len(x)))])
17
df.groupby('Group_Id').sample(n=1)

在1.1.0版本中新增的功能。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.DataFrameGroupBy.sample.html

19

有两种很简单的方法来做到这一点,其中一种只用基本的pandas语法:

df[['x','y']].groupby('x').agg(pd.DataFrame.sample)

这个方法在处理5万行的数据时,耗时14.4毫秒。

另一种稍微快一点的方法是用numpy。

df[['x','y']].groupby('x').agg(np.random.choice)

这个方法在处理同样5万行的数据时,耗时10.9毫秒。

一般来说,使用pandas时,最好还是使用它自带的语法。特别是对于初学者来说。

65

0.16.x 版本开始,pd.DataFrame.sample 提供了一种方法,可以从对象的某个方向随机返回一些样本。

In [664]: df.groupby('Group_Id').apply(lambda x: x.sample(1)).reset_index(drop=True)
Out[664]:
  Name  Group_Id
0  ABC         1
1  XYZ         2
2  DEF         3
49

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能会在使用某个特定的功能时,发现它的表现和预期不一样。这种情况可能会让人感到困惑,不知道该怎么解决。

通常,解决这类问题的方法是查看相关的文档或者社区的讨论。很多时候,其他人也遇到过类似的问题,他们可能已经找到了解决办法或者给出了有用的建议。

在这种情况下,提问也是一个不错的选择。你可以把你的问题描述得清楚一些,告诉大家你遇到了什么情况,使用了什么工具,以及你希望达到的目标。这样,其他人就能更好地理解你的问题,并提供帮助。

总之,遇到问题时,不要慌张,先查找资料,看看有没有人遇到过类似的情况。如果没有,勇敢地提问,通常会有人愿意帮助你。

size = 2        # sample size
replace = True  # with replacement
fn = lambda obj: obj.loc[np.random.choice(obj.index, size, replace),:]
df.groupby('Group_Id', as_index=False).apply(fn)

撰写回答