我有一個這樣的資料框:
mydf = {'p1':[0.1, 0.2, 0.3], 'p2':[0.2, 0.1,0.3], 'p3':[0.1,0.9, 0.01], 'p4':[0.11, 0.2, 0.4], 'p5':[0.3, 0.1,0.5],
'w1':['cancel','hello', 'hi'], 'w2':['good','bad','ugly'], 'w3':['thanks','CUSTOM_MASK','great'],
'w4':['CUSTOM_MASK','CUSTOM_UNKNOWN', 'trible'],'w5':['CUSTOM_MASK','CUSTOM_MASK','job']}
df = pd.DataFrame(mydf)
所以我需要做的是總結列中的所有值,p1,p2,p3,p4,p5如果對應的值w1,w2,w3,w4,w5不是CUSTOM_MASK或CUSTOM_UNKNOWN。
因此,結果將是向資料框中添加一列,如下所示:(0.1 0.2 0.1=0.4 用于第一行)。
top_p
0.4
0.3
1.51
所以我的問題是有沒有什么熊貓方法可以做到這一點?
到目前為止,我所做的是遍歷行和列并檢查值(CUSTOM_MASK, CUSTOM_UNKNOWN),然后在列中不存在這些值時將其總結。
uj5u.com熱心網友回復:
您可以使用mask. 這個想法是用列創建一個布爾掩碼w,并使用它來過濾相關w列和sum:
df['top_p'] = df.filter(like='p').mask(df.filter(like='w').isin(['CUSTOM_MASK','CUSTOM_UNKNOWN']).to_numpy()).sum(axis=1)
輸出:
p1 p2 p3 p4 p5 w1 w2 w3 w4 w5 top_p
0 0.1 0.2 0.10 0.11 0.3 cancel good thanks CUSTOM_MASK CUSTOM_MASK 0.40
1 0.2 0.1 0.90 0.20 0.1 hello bad CUSTOM_MASK CUSTOM_UNKNOWN CUSTOM_MASK 0.30
2 0.3 0.3 0.01 0.40 0.5 hi ugly great trible job 1.51
在summing 之前,輸出mask如下所示:
p1 p2 p3 p4 p5
0 0.1 0.2 0.10 NaN NaN
1 0.2 0.1 NaN NaN NaN
2 0.3 0.3 0.01 0.4 0.5
uj5u.com熱心網友回復:
這是一種使用以下方法執行此操作的方法np.dot():
pCols, wCols = ['p' str(i 1) for i in range(5)], ['w' str(i 1)for i in range(5)]
mydf['top_p'] = mydf.apply(lambda x: np.dot(x[pCols], ~(x[wCols].isin(['CUSTOM_MASK','CUSTOM_UNKNOWN']))), axis=1)
我們首先準備兩組列名p1,...,p5和w1,...,w5.
然后我們使用基于列的過濾條件對列apply()中的值進行點積(即僅包括來自其對應列值不在排除字串串列中的列值的貢獻)。pNwNpNwN
輸出:
p1 p2 p3 p4 p5 w1 w2 w3 w4 w5 top_p
0 0.1 0.2 0.10 0.11 0.3 cancel good thanks CUSTOM_MASK CUSTOM_MASK 0.40
1 0.2 0.1 0.90 0.20 0.1 hello bad CUSTOM_MASK CUSTOM_UNKNOWN CUSTOM_MASK 0.30
2 0.3 0.3 0.01 0.40 0.5 hi ugly great trible job 1.51
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/459173.html
標籤:Python python-3.x 熊猫 数据框 筛选
上一篇:如果您有重復的日期,則滾動1天
