我有這個數據框(縮短):+-------+------------+--------+----------+-------+------+| 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
提交
取消