【问题标题】:Python Pandas Dataframe samplingPython Pandas 数据帧采样
【发布时间】:2018-02-01 09:07:55
【问题描述】:

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

这是我正在查看的任务:

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

编号 |班级 ------ | ------ 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

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

编号 |班级 ------ | ------ 1 | 1 1 | 0 2 | 1 2 | 1 2 | 0 2 | 0 3 | 1 3 | 1 3 | 0 3 | 0

有什么好主意吗?

【问题讨论】:

    标签: python pandas dataframe sampling balance


    【解决方案1】:

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

    【讨论】:

    • 是的,我也想过这个问题,但我希望有一种优雅的方式使用 pandas 示例方法和一些花哨的权重来平衡类和 id。
    【解决方案2】:

    我想到了这个:

    1. 取 class= 0 部分数据集
    2. 取 class= 数据集的 1 部分
    3. class0 数据集中的样本与 class1 数据集中的行数相同
    4. 连接
        df0 = df[df['class'] == 0]
        df1 = df[df['class'] == 1]
        df_strat = pd.concat([df0.sample(df1.shape[0]),df1])
    

    【讨论】:

      猜你喜欢
      • 2017-09-19
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多