簡體   English   中英

pandas df 在多列上應用條件

[英]pandas df apply condition on multiple columns

我有一個看起來像這樣的df:

pd.DataFrame.from_dict({'master_feature':['ab',float('NaN'),float('NaN')],
    'feature':[float('NaN'),float('NaN'),'pq'],
    'epic':[float('NaN'),'fg',float('NaN')]})

我想創建一個名為從 master_feature、epic 和 feature 列中promoted的新列:

promoted的價值將是:

  • 如果相鄰的master_feature列值不是 null,則master feature
  • 如果相鄰feature列的值不是 null,則feature ,對於epic也是如此

就像是:

df.promoted = 'master feature' if not pd.isnull(df.master_feature) 
               elseif 'feature' if not pd.isnull(df.feature) 
               elseif 'epic' pd.isnull(df.epic) 
               else 'Na' 

如何使用df.apply實現這一目標? 如果我使用np.select會更有效嗎?

np.select是通往 go 的方式。 下面試試。 . . 我想我根據你的問題得到了正確的邏輯。 此外,您的邏輯存在一些差異:“如果相鄰特征列值不是 null,並且對於史詩,則特征”與“elseif 'epic' pd.isnull(df.epic)”不同所以我選擇了 if df['epic'] is not null then 'epic'讓我知道這是否正確。

cond = [~df['master_feature'].isna(), # if master_feater is not null then 'master feater'
        ~df['feature'].isna(), # if feature is not null then 'feature
        ~df['epic'].isna()] # if epic is not null then 'epic'

choice = ['master feature', 
          'feature', 
          'epic']

df['promoted'] = np.select(cond, choice, np.nan)

  master_feature feature epic        promoted
0             ab     NaN  NaN  master feature
1            NaN     NaN   fg            epic
2            NaN      pq  NaN         feature

可以通過apply()和 numpy argmin argmin()的組合來完成

df = pd.DataFrame.from_dict({'master_feature':['ab',float('NaN'),float('NaN')],
    'feature':[float('NaN'),float('NaN'),'pq'],
    'epic':[float('NaN'),'fg',float('NaN')]})

df.assign(promoted=lambda dfa: dfa.apply(lambda r: r[np.argmin(r.isna())], axis=1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM