基于Pandas随机抽取行数据N次生成新DataFrame
问题描述
现有如下DataFrame(df),其中2022年7-12月的val值未知(标记为?)。需从2019、2020、2021年对应7-12月的val值中,对每个缺失月份进行n次随机抽取,将每次抽取的结果保存为新的DataFrame。当n=5时,预期输出格式如下。
原始DataFrame:
index month team year val cum_val 0 1 celtics 2019 4 4 1 2 celtics 2019 9 13 2 3 celtics 2019 17 30 3 4 celtics 2019 4 34 4 5 celtics 2019 7 41 5 6 celtics 2019 8 49 6 7 celtics 2019 2 51 7 8 celtics 2019 5 56 8 9 celtics 2019 1 57 9 10 celtics 2019 0 57 10 11 celtics 2019 18 75 11 12 celtics 2019 16 91 12 1 celtics 2020 7 7 13 2 celtics 2020 18 25 14 3 celtics 2020 27 52 15 4 celtics 2020 4 56 16 5 celtics 2020 9 65 17 6 celtics 2020 13 78 18 7 celtics 2020 2 80 19 8 celtics 2020 2 82 20 9 celtics 2020 5 87 21 10 celtics 2020 3 90 22 11 celtics 2020 7 97 23 12 celtics 2020 7 104 24 1 celtics 2021 3 3 25 2 celtics 2021 4 7 26 3 celtics 2021 2 9 27 4 celtics 2021 21 30 28 5 celtics 2021 5 35 29 6 celtics 2021 8 43 30 7 celtics 2021 27 70 31 8 celtics 2021 11 81 32 9 celtics 2021 4 85 33 10 celtics 2021 3 88 34 11 celtics 2021 1 89 35 12 celtics 2021 9 98 36 1 celtics 2022 14 14 37 2 celtics 2022 5 19 38 3 celtics 2022 29 48 39 4 celtics 2022 9 57 40 5 celtics 2022 0 57 41 6 celtics 2022 28 85 42 7 celtics 2022 ? 85 43 8 celtics 2022 ? 85 44 9 celtics 2022 ? 85 45 10 celtics 2022 ? 85 46 11 celtics 2022 ? 85 47 12 celtics 2022 ? 85
n=5时预期输出:
month n1 n2 n3 n4 n5 7 27 2 27 2 2 8 11 11 2 5 5 9 4 1 4 5 1 10 0 3 0 3 3 11 18 1 1 7 18 12 16 9 9 7 16
实现方法
使用Python的pandas和numpy库可以快速实现需求,步骤如下:
- 导入依赖库
import pandas as pd import numpy as np
- 筛选数据源
从原始DataFrame中提取2019-2021年7-12月的val数据,作为抽样的数据源:
# 筛选目标年份和月份的数据 source_data = df[(df['year'].isin([2019, 2020, 2021])) & (df['month'].between(7, 12))]
- 执行随机抽样
按月份分组,对每个月份的val列进行n次随机抽取(采用放回抽样,因为抽取次数n可能大于每个月份的样本量):
n = 5 # 设置抽取次数 # 分组抽样,每组抽n个值并转置为列 sample_df = source_data.groupby('month')['val'].apply(lambda x: np.random.choice(x, size=n, replace=True)).unstack()
- 调整结果格式
将列名改为n1到n5,并让month作为普通列(与预期输出一致):
# 重命名列 sample_df.columns = [f'n{i+1}' for i in range(n)] # 重置索引,让month成为列 sample_df = sample_df.reset_index()
运行上述代码后,sample_df就是符合预期的结果DataFrame。
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

