Python: 按组随机选择
假设我有一个数据表,长得像这样:
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)