當第三個條件和選項被洗掉時,下面的代碼可以正常執行。
我正在使用該operator模塊傳遞波浪號。
問題是有時我不想與這些陳述相反,而有時我會這樣做。
在該conditions部分中,我通過None避免在那里使用運算子,但這顯然是不正確的。我還嘗試使用if陳述句來避免使用逆運算子,但我不知道如何將if陳述句與&.
FWIW - 我意識到我可以單獨定義所有可能的specs,但是有十幾個,所以這種方法對我來說似乎好多了。
import pandas as pd
import numpy as np
from operator import lt as less_than, invert as invrt
import math
infinity = math.inf
names = [
[5, 'b0524', .02, 'shoes'],
[1, 'b0874', .12, 'toy'],
[10, 'b0321', .11, 'b0321'],
[7, 'b0781', .60, 'car'],
[8, 'b0321', .16, 'plane']
]
df = pd.DataFrame(names, columns=['orders', 'id', 'acos', 'term'])
acos = .15
exclude = ['toy']
def specs(df, min_orders, max_orders, operator, acos, exclude, tilde1, tilde2):
return (
(df['orders'] >= min_orders) &
(df['orders'] <= max_orders) &
(operator(df['acos'], acos)) &
(tilde1(df['term'].str.contains('|'.join(exclude)))) &
(tilde2(df['term'].str.contains(pat = 'b0', case = False)))
)
def strategy(df, acos, exclude):
conditions = ([
specs(df, 3, infinity, less_than, acos, exclude, invrt, invrt),
specs(df, 1, 2, less_than, acos, exclude, invrt, invrt),
specs(df, 1, 2, less_than, acos, exclude, None, None),
])
choices = [
'strat1',
'strat2',
'strat3'
]
df['strategy'] = np.select(conditions, choices, default='NA')
return df
strategy(df, acos, exclude)
print(df)
uj5u.com熱心網友回復:
我認為這樣的事情應該有效。這個想法是使用conditional expression(aka ) 在實際呼叫和簡單地回傳一個類似大小的結果ternary operator之間切換(可能有一種更優雅的方法來做到這一點,但我已經通過比較自身的相等性得到了陣列,這將永遠是)。tilde2TrueTruedf['term']True
def specs(df, min_orders, max_orders, operator, acos, exclude, tilde1, tilde2):
return (
(df['orders'] >= min_orders) &
(df['orders'] <= max_orders) &
(operator(df['acos'], acos)) &
(tilde1(df['term'].str.contains('|'.join(exclude)))) &
(df['term'] == df['term'] if tilde2 is None else tilde2(df['term'].str.contains(pat = 'b0', case = False)))
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441562.html
上一篇:如何計算資料框中所有行的專案總數
