Python Pandas Dataframe采样

时间:2017-08-23 16:55:21

标签: python pandas dataframe sampling balance

我正在寻找一种以特定方式对数据集进行采样的优雅方法。我找到了一些解决方案,但我想知道你们中是否有人知道更好的方法。

以下是我正在查看的任务:

我想平衡我的数据集,因此我对类0的实例数量与类1相同,因此在下面的示例中,我们有5个类1实例和11个0类实例:

id | class
------ | ------ 
1 | 1
1 | 0
1 | 0
1 | 0
1 | 0
2 | 1
2 | 1
2 | 0
2 | 0 
2 | 0
3 | 1
3 | 1
3 | 0
3 | 0
3 | 0
3 | 0

Sofar我刚刚删除了6个0级实例,但我想防止一个id的所有实例都被删除。我尝试使用sklearn进行分层“分裂”,但它不起作用,因为并非每个id都包含多个项目。所需的输出应该类似于:

id | class
------ | ------ 
1 | 1
1 | 0
2 | 1
2 | 1
2 | 0
2 | 0 
3 | 1
3 | 1
3 | 0
3 | 0

有什么好主意吗?

2 个答案:

答案 0 :(得分:0)

我最好的猜测:'保护'每个id中的一个随机行(用这些行创建单独的数据帧),然后从原始数据帧中删除直到满意为止(包括“受保护”数据帧中的类将与之齐起的事实还剩下什么)并连接两个数据帧?

答案 1 :(得分:0)

我想到了这一点:

  1. 取class = 0部分数据集
  2. 取class =数据集的一部分
  3. 来自class0数据集的样本与class1数据集中的行数相同
  4. 级联

    df0 = df [df ['class'] == 0]

    df1 = df [df ['class'] == 1]

    df_strat = pd.concat([df0.sample(df1.shape [0]),df1])