在 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)
假设我有这样一个数据框
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)