在 python 中对整个组进行上采样

upsampling entire groups in python

假设我有这样一个数据框

import pandas as pd

df = pd.DataFrame({'ID':[1,1,1,1,1,2,2,2,2], 'Order':[1,2,3,4,5,1,2,3,4]})

df
    ID  Order
0   1   1
1   1   2
2   1   3
3   1   4
4   1   5
5   2   1
6   2   2
7   2   3
8   2   4



我需要对整个块进行上采样,因此本质上是为 ID == 1 和 ID == 2 创建块的新副本。所以上采样的 df(对于 n = 2 两个样本有替换)可能看起来像喜欢


df_upsampled = pd.DataFrame({'ID':[1,1,1,1,1,2,2,2,2,1,1,1,1,1,2,2,2,2], 'Order':[1,2,3,4,5,1,2,3,4,1,2,3,4,5,1,2,3,4]})

df_upsampled

    ID  Order
0   1   1
1   1   2
2   1   3
3   1   4
4   1   5
5   2   1
6   2   2
7   2   3
8   2   4
9   1   1
10  1   2
11  1   3
12  1   4
13  1   5
14  2   1
15  2   2
16  2   3
17  2   4

我认为我可以使用 resample() 快速处理这个问题,但还没有弄清楚如何复制整个块(每个 ID)

所以基本上您需要做的就是获取数据框的副本并将其连接到原始数据框:

df = pd.concat([df, df], ignore_index=True)

series 上的repeat 函数将是一个更好的通用解决方案。它仅适用于 Series,因此您必须将其与 apply 结合使用才能应用于所有列。

df_upsampled = df.apply(pd.Series.repeat, axis=0, repeats=500)
# %timeit 646 µs ± 12.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
df = pd.concat([df for x in range(500)], ignore_index=True)
# %timeit 8.41 ms ± 623 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)