带有条件的熊猫sample()

时间:2020-05-19 15:19:29

标签: python python-3.x pandas dataframe

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

+-------+------------+--------+----------+-------+------+
| 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])

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

1 个答案:

答案 0 :(得分:1)

  • 所选的3行应具有3个不同的eco​​m_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_pdpr_2_pdpr_3_pd进行采样,然后使用pd.concat合并结果以实现此目的。