我有这个数据框(缩短):+-------+------------+--------+----------+-------+------+| 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])但我不确定如何将所有过滤器组合在一起
1 回答
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
选择的 3 行应该有 3 个不同的 ecom_id:(14,27,13) 好,(14,27,14) 不好。
replace=False
if中的设置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
以实现此目的。
添加回答
举报
0/150
提交
取消