Pandas 基于条件和样本大小的数据帧样本
Pandas dataframe sample based on condition and sample size
代码:
import pandas as pd
df = pd.DataFrame({'data': list(range(100))})
我想取一个大小为 20 的样本,这样 80% 的元素在 0 到 10 之间,20% 的元素在 50 到 70 之间。(随机抽样)。
我想要一种适用于任意数量条件的方法。
我的想法可行但不干净:
对 0 到 10 之间的所有内容进行采样,并取 80% * 20 个随机行,对其余值执行相同操作,然后连接。
是否有我可以使用的 pandas 内置函数,因为它不能很好地适应更多条件?
您可以使用 bin 和比例字典进行抽样。
# ┌─0─┐┌─1─┐┌─2─┐┌─3───┐
bins = [-1, 10, 50, 70, float('inf')]
fraction = {0: 0.8, 2: 0.2} # group 0 is -1-10, group 2 is 50-70
size = 20
groups = pd.cut(df['data'], bins=bins, labels=range(len(bins)-1))
sampled = (df
.groupby(groups)['data']
.apply(lambda g: g.sample(n=int(fraction.get(g.name, 0)*size),
replace=True)
)
#.droplevel(0)
)
注意。我在这里的示例中使用了 replace=True
,因为否则不可能从 0-10 组中获得 16 个唯一元素,但您可以在您的真实数据中更改它,条件是安全的。此外,添加 .droplevel(0)
以删除组 ID。
输出:
data
0 6 6
8 8
2 2
3 3
0 0
0 0
6 6
0 0
6 6
3 3
10 10
3 3
8 8
8 8
8 8
2 2
2 54 54
53 53
62 62
64 64
Name: data, dtype: int64
代码:
import pandas as pd
df = pd.DataFrame({'data': list(range(100))})
我想取一个大小为 20 的样本,这样 80% 的元素在 0 到 10 之间,20% 的元素在 50 到 70 之间。(随机抽样)。
我想要一种适用于任意数量条件的方法。
我的想法可行但不干净: 对 0 到 10 之间的所有内容进行采样,并取 80% * 20 个随机行,对其余值执行相同操作,然后连接。 是否有我可以使用的 pandas 内置函数,因为它不能很好地适应更多条件?
您可以使用 bin 和比例字典进行抽样。
# ┌─0─┐┌─1─┐┌─2─┐┌─3───┐
bins = [-1, 10, 50, 70, float('inf')]
fraction = {0: 0.8, 2: 0.2} # group 0 is -1-10, group 2 is 50-70
size = 20
groups = pd.cut(df['data'], bins=bins, labels=range(len(bins)-1))
sampled = (df
.groupby(groups)['data']
.apply(lambda g: g.sample(n=int(fraction.get(g.name, 0)*size),
replace=True)
)
#.droplevel(0)
)
注意。我在这里的示例中使用了 replace=True
,因为否则不可能从 0-10 组中获得 16 个唯一元素,但您可以在您的真实数据中更改它,条件是安全的。此外,添加 .droplevel(0)
以删除组 ID。
输出:
data
0 6 6
8 8
2 2
3 3
0 0
0 0
6 6
0 0
6 6
3 3
10 10
3 3
8 8
8 8
8 8
2 2
2 54 54
53 53
62 62
64 64
Name: data, dtype: int64