有条件的 Pandas sample()

我有这个数据框(缩短):


+-------+------------+--------+----------+-------+------+

| index | id_product | margin | supplier | price | seen |

+-------+------------+--------+----------+-------+------+

| 0     | 100000000  | 92.00  | 14       | 0.56  | 2    |

| 1     | 100000230  | 72.21  | 27       | 8.17  | 0    |

| 2     | 100001440  | 72.07  | 15       | 16.20 | 687  |

| 3     | 100002331  | 30.55  | 13       | 41.67 | 0    |

| 7     | 100001604  | 35.17  | 27       | 18.80 | 491  |

| ...   | ...        | ...    | ...      | ...   | ...  |

| 9830  | 100000320  | 77.78  | 18       | 13.33 | 0    |

| 9831  | 100000321  | 77.78  | 98       | 13.33 | 0    |

| 9832  | 100000443  | 77.78  | 17       | 13.33 | 4587 |

| 9834  | 100000292  | 88.13  | 3        | 10.56 | 0    |

| 9835  | 100000236  | 72.21  | 18       | 10.56 | 0    |

+-------+------------+--------+----------+-------+------+

我想做的是随机提取 3 行,使用df.sample(3)maybe,但条件如下:


选择的 3 行应该有 3个不同的ecom_id:(14,27,13) 好,(14,27,14) 不好。


具有较高边距的行应该享有特权。我用weights='margin',效果不错。


seen较低的行应该享有特权。是否可以使用 sample() 反转权重计数以优先考虑最低值?


应在 3 个不同的价格切片中找到 3 个选定行:第一个选定行的价格应小于 20.0,第二个选定行的价格应在 30 到 50 之间,最后第三个也是最后一个选定行的价格应 > 80。


这可能吗 ?


我尝试过类似的东西:


pr_1_pd = pr_pd.loc[pr_pd['price'] < 20]

pr_2_pd = pr_pd.loc[(pr_pd['price'] > 30) & (pr_pd['price'] < 50)]

pr_3_pd = pr_pd.loc[pr_pd['price'] > 80]


pr_1_pd = pr_1_pd.sort_values(by=['margin','seen'],ascending=[False,True])

pr_2_pd = pr_2_pd.sort_values(by=['margin','seen'],ascending=[False,True])

pr_3_pd = pr_3_pd.sort_values(by=['margin','seen'],ascending=[False,True])

但我不确定如何将所有过滤器组合在一起


弑天下
浏览 81回答 1
1回答

慕尼黑的夜晚无繁华

选择的 3 行应该有 3 个不同的 ecom_id:(14,27,13) 好,(14,27,14) 不好。replace=Falseif中的设置pd.sample应该实现这一点ecom_id是唯一的。seen 较低的行应该享有特权。是否可以使用 sample() 反转权重计数以优先考虑最低值?您可以反转权重new_weight = 1 / seen来实现此目的。应在 3 个不同的价格切片中找到 3 个选定行:第一个选定行的价格应小于 20.0,第二个选定行的价格应在 30 到 50 之间,最后第三个也是最后一个选定行的价格应 > 80。您必须分别从pr_1_pd、pr_2_pd和中采样,pr_3_pd然后将结果组合起来pd.concat以实现此目的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python