如何实现每次打印时从DataFrame df0随机生成20条记录的df1子集?
问题描述
我有一个包含100条记录的DataFrame df0,希望每次打印df1时,都能生成一个包含20条记录的子集。该子集的记录从df0中随机选取且顺序随机,同时保持列数与df0一致,所有df1中的数据均来自df0。
示例:
df0 结构如下:
| calories | duration | name | |
|---|---|---|---|
| 0 | 420 | 50 | Ana |
| 1 | 380 | 40 | Mike |
| ... | ... | ... | ... |
| 99 | 390 | 45 | James |
第一次执行print(df1),输出的随机子集:
| calories | duration | name | |
|---|---|---|---|
| 0 | 420 | 50 | Ana |
| 1 | 230 | 10 | Joe |
| ... | ... | ... | ... |
| 19 | 380 | 42 | Eli |
第二次执行print(df1),输出另一组随机子集:
| calories | duration | name | |
|---|---|---|---|
| 0 | 620 | 36 | Megan |
| 1 | 390 | 45 | James |
| ... | ... | ... | ... |
| 19 | 430 | 42 | Rick |
以此类推……
解决方案
可以利用Pandas的sample()方法结合动态属性或函数,实现每次访问/调用时生成新的随机子集。
方法1:使用@property装饰器(动态属性)
将df1定义为动态属性,每次访问都会重新生成随机子集:
import pandas as pd # 假设df0是已存在的100条记录的DataFrame @property def df1(): # 随机选取20条记录,重置索引 return df0.sample(n=20).reset_index(drop=True) # 使用示例 print(df1) # 第一次生成随机子集 print(df1) # 第二次生成全新的随机子集
方法2:定义函数
如果更习惯用函数调用,也可以定义一个生成子集的函数:
def get_random_subset(): return df0.sample(n=20).reset_index(drop=True) # 使用示例 print(get_random_subset()) # 第一次打印随机子集 print(get_random_subset()) # 第二次打印全新的随机子集
代码说明
sample(n=20):从df0中随机抽取20条记录,默认是不放回抽样;如果需要允许重复抽取同一条记录,添加参数replace=True即可。reset_index(drop=True):重置子集的索引为0开始的连续整数,避免保留原df0的索引值导致混乱。- 每次调用/访问时,
sample会使用不同的随机种子(默认random_state=None),确保每次结果都是随机且不同的。
内容的提问来源于stack exchange,提问作者Sanket Sathe
相关产品推荐
相关产品推荐

