基于列中的多个值对 Pandas 数据框进行采样

Sample Pandas dataframe based on multiple values in column

我正在尝试为机器学习整理数据集。 了解如何对列中包含两个值的数据帧进行采样(二元选择)。

在我的例子中,我在 x 列中有很多值。我希望数据框中的记录数量相等

例子

     x
0    5
1    5
2    5
3    0
4    0
5    9
6   18
7    3
8    5

** 对于第一个** 我有 2 行 x = 0 和 7 行 x != 0。结果应该平衡这一点并且是 4 行:两行 x = 0 和 2 其中 x != 0 (随机选择)。为了便于说明,保留相同的索引

1    5
3    0
4    0
6   18

** 第二个** 我有 2 行 x = 0、4 行 x = 5 和 3 行 x != 0 && x != 5。结果应该平衡这一点,总共有 6 行:每个条件两行。为了便于说明,保留相同的索引

1    5
3    0
4    0
5    9
6   18
8    5

我已经完成了 2 个条件和 3 个条件的示例。推广到更多的解决方案会很好。如果它检测到最小行数(在本例中为 0)会更好,因此我不需要在编写条件之前先解决这个问题。

如何使用 pandas 执行此操作?我可以将自定义函数传递给 .groupby() 来执行此操作吗?

IIUC,您可以 groupby 条件是“x”是否为 0 和 sample 每个组的 smallest-group-size 条目数:

g = df.groupby(df['x']==0)['x']
out = g.sample(n=g.count().min()).sort_index()

(一个例子)输出:

1    5
3    0
4    0
5    9
Name: x, dtype: int64

对于第二种情况,我们可以使用numpy.selectnumpy.unique来得到组(其余与上面基本相同):

import numpy as np
groups = np.select([df['x']==0, df['x']==5], [1,2], 3)
g = df.groupby(groups)['x']
out = g.sample(n=np.unique(groups, return_counts=True)[1].min()).sort_index()

示例输出:

2    5
3    0
4    0
5    9
7    3
8    5
Name: x, dtype: int64

IIUC,并且您想要 any 两条 non-zero 记录:

mask = df['x'].eq(0)
pd.concat([df[mask], df[~mask].sample(mask.sum())]).sort_index()

输出:

   x
1  5
2  5
3  0
4  0

第二部分:

mask0 = df['x'].eq(0)
mask5 = df['x'].eq(5)
pd.concat([df[mask0], 
           df[mask5].sample(mask0.sum()), 
           df[~(mask0 | mask5)].sample(mask0.sum())]).sort_index()

输出:

    x
2   5
3   0
4   0
6  18
7   3
8   5