【问题标题】:How to sample a dataframe based on a given distribution where limited classes attenuate the other classes?如何根据给定的分布对数据框进行采样,其中有限的类会削弱其他类?
【发布时间】:2022-01-24 22:46:53
【问题描述】:

鉴于类的分布和这些类的示例行的数据框,是否有一种简单/快速的方法可以从数据框中采样与给定分布匹配的分布,其中没有足够示例的类会减少其他类中的示例数量:

例如

+------+-------+-------+
| col1 | col2 | class |
+------+-------+-------+
| 4    | 45    | A     |
+------+-------+-------+
| 5    | 66    | B     |
+------+-------+-------+
| 5    | 6     | C     |
+------+-------+-------+
| 4    | 6     | A     |
+------+-------+-------+
| 321  | 1     | A     |
+------+-------+-------+
| 32   | 432   | A     |
+------+-------+-------+
| 5    | 3     | B     |
+------+-------+-------+

given a dataframe like above and the distribution like below:
+-------+--------------+
| class | proportion   |
+-------+--------------+
| A     | 0.50         |
+-------+--------------+
| B     | 0.25         |
+-------+--------------+
| C     | 0.25         |
+-------+--------------+

I would like to return something like:
+------+-------+-------+
| col1 | col2 | class |
+------+-------+-------+
| 5    | 66    | B     |
+------+-------+-------+
| 5    | 6     | C     |
+------+-------+-------+
| 4    | 6     | A     |
+------+-------+-------+
| 32   | 432   | A     |
+------+-------+-------+


【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    df.sample 支持称重实体:

    s = pd.Series({'A': 0.5, 'B': 0.25, 'C': 0.25})
    df.sample(n, weights=df['class'].map(s/df['class'].value_counts()))
    

    要获取有关该主题的更多信息,请搜索“标签转换”

    【讨论】:

    • 这将始终从 df 返回 n 行。我希望它在仍受分布限制的情况下尽可能返回最大数量。例如。想象一下,有 10000 行“A”类,每行只有 2 行“B”和“C”。鉴于相同的分布,我想要一个有 8 行的 df(4 'A'、2 'B'、2 'C')。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2020-05-15
    • 2017-05-20
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多