基于列中的多个值对 Pandas 数据框进行采样
Sample Pandas dataframe based on multiple values in column
我正在尝试为机器学习整理数据集。 了解如何对列中包含两个值的数据帧进行采样(二元选择)。
在我的例子中,我在 x
列中有很多值。我希望数据框中的记录数量相等
x
是 0
或 not 0
- 或者在更复杂的示例中,
x
中的值是 0
、5
或 other value
例子
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.select
和numpy.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
我正在尝试为机器学习整理数据集。
在我的例子中,我在 x
列中有很多值。我希望数据框中的记录数量相等
x
是0
或not 0
- 或者在更复杂的示例中,
x
中的值是0
、5
或other value
例子
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.select
和numpy.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