Pandas DataFrame分组需求:为每个Task分配唯一TaskClass观测值
按Task随机抽取唯一TaskClass记录的解决方案
嘿,这个需求其实用Pandas自带的分组抽样功能就能轻松搞定,完全适配你数千个Task的大规模场景,给你详细拆解下:
核心实现代码
假设你的数据存储在df这个DataFrame里,一行代码就能解决问题:
# 按Task分组,每组随机选1行 result_df = df.groupby('Task', group_keys=False).sample(n=1)
关键参数解释
groupby('Task'):把数据按Task字段分组,确保每个Task单独成组处理sample(n=1):每组随机抽取1条记录,正好满足每个Task对应唯一TaskClass的要求group_keys=False:避免结果里多出分组相关的索引,让输出结构和原DataFrame保持一致- (可选)如果需要固定随机结果方便测试,可以加
random_state=42这类固定数值,去掉的话每次运行都会得到不同的随机抽样结果
针对你提供的多TaskClass示例验证
比如你给出的包含4种TaskClass的测试数据:
Year Month Task TaskID TaskClass TaskClassID SomeValue
2019 11 A 1 X 10 6.58
2019 11 A 1 Y 20 1.58
2019 11 A 1 Z 30 1.00
2019 11 A 1 W 40 0.25
2019 11 B 2 X 10 6.58
2019 11 B 2 Y 20 1.58
2019 11 B 2 Z 30 1.00
2019 11 B 2 W 40 0.25
运行代码后会得到类似这样的随机输出(每次结果可能不同):
| Year | Month | Task | TaskID | TaskClass | TaskClassID | SomeValue |
|---|---|---|---|---|---|---|
| 2019 | 11 | A | 1 | W | 40 | 0.25 |
| 2019 | 11 | B | 2 | X | 10 | 6.58 |
进阶玩法:按权重抽样(可选)
如果想让某些TaskClass被选中的概率更高(比如SomeValue越大越容易被选),可以给sample加weights参数:
# 按SomeValue的大小作为抽样权重,值越大越容易被选中 result_df = df.groupby('Task', group_keys=False).sample( n=1, weights='SomeValue' )
性能说明
这个方法处理数千个Task完全没问题,groupby和sample都是Pandas底层优化过的操作,在大规模数据集上的效率很高,不会出现性能瓶颈。
内容的提问来源于stack exchange,提问作者Nuno Heli Beires
相关产品推荐
相关产品推荐

