我有这个数据框(缩短了):
+-------+------------+--------+----------+-------+------+
| 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 |
+-------+------------+--------+----------+-------+------+
我想做的是使用df.sample(3)
随机抽取3行,但是在这种情况下:
所选的3行应具有3个不同的 ecom_id :(14,27,13)很好,(14,27,14)不好。
具有较高边距的行应具有特权。我使用weights='margin'
,效果很好。
具有较低的可见的行应具有特权。是否可以将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])
但是我不确定如何将所有过滤器组合在一起
答案 0 :(得分:1)
- 所选的3行应具有3个不同的ecom_id:(14,27,13)好,(14,27,14)不好。
如果replace=False
是唯一的,则在pd.sample
中设置ecom_id
应该可以实现。
可见度较低的
- 行应享有特权。是否可以将sample()的权重计数反转为特权最低值?
您可以反转权重new_weight = 1 / seen
来实现这一目标。
- 应该在3个不同的价格切片中找到3个选定的行:第一个选定的行的价格应<20.0,第二个选定的行的价格应在30到50之间,最后,第三和最后一个选定的行的价格应> 80。
您必须分别从pr_1_pd
,pr_2_pd
和pr_3_pd
进行采样,然后使用pd.concat
合并结果以实现此目的。