簡體   English   中英

Python:pandas dataframe 多個條件滿足一個條件插入一行

[英]Python: Inserting a row if a condition is met in pandas dataframe for multiple conditions

所以我有如下所示的 dataframe:

Id     a_no    desc       flag_1    flag_2 
100     20     test         1         0
100     25     new_test     1         1
110     25     new_test     0         1

現在我正在嘗試使用以下邏輯添加兩列msgfinal_flag

if len(desc) < 5, then msg = 'Short length' and final_flag = 'Reject'
if flag_1 == 0, then msg = 'Missing_item' and final_flag = 'Error'
if flag_2 == 0, then msg = 'Find_item' and final_flag = 'Error'

為了實現上述目標,我正在嘗試下面的代碼

df['msg'] = np.where(df['desc'].str.len() < 5,'Short length',\
            np.where(df['flag_1']==0,'Missing_item',\
            np.where(df['flag_2']==0,'Find_item','All is Good')))
df['final_flag'] = np.where(df['msg'].str.contains('Missing | Find',regex=True),'Error',np.where(df['msg'].str.contains('Good',regex=True),'Accepted','Reject'))

使用上面的代碼,我沒有得到所需的 output,如下所示:

Id     a_no    desc       flag_1    flag_2      msg             final_flag
100     20     test         1         0     'Short length'         Reject
100     20     test         1         0     'Find Item'            Error <--as flag_2 ==0 
100     25     new_test     1         1     'All is Good'          Accepted
110     25     new_test     0         1     'Missing Item'         Error

即對於每一個條件(或者如上所示的邏輯),如果滿足條件,則在最后的dataframe中插入一行。

我可以看到我的代碼片段還不夠。

我錯過了什么嗎?

所以我已經制定了如下內容:

# creating a column based on each logic#
df['msg_str'] = np.where(df['desc'].str.len() < 5, 'Short Length','')
df['msg_flag_1'] = np.where(df['flag_1']==0,'Missing Item','')
df['msg_flag_2'] = np.where(df['flag_2']==0,'Find Item','')
#Unpivoting the dataframe
df_melt = pd.melt(df,id_vars = ['msg_str','msg_flag_1','msg_flag_2'],value_name='msg')

上述技術應產生如下所示的 dataframe:

Id    a_no      variable      msg
100    20       msg_str      Short Length
100    20       msg_flag_1   
100    20       msg_flag_2   Find Item
100    25       msg_str      
100    25       msg_flag_1   
100    25       msg_flag_2  
110    25       msg_str     
110    25       msg_str_1    Missing Item
110    25       msg_str_2      

現在我添加另一個列:

df_melt['status'] = np.where(df_melt['msg'].str.contains('Missing|Short|Find',regex=True),'Reject','Accept')

這實際上解決了問題。 當然我可以pivot上面的df再次得到想要的output。

您也可以使用 apply function:

dt['msg'] =''
dt['final_flag']=''
def replace_dt(x):
    if len(x['desc'])<5: 
        x.loc['msg','final_flag']=['Short length','Reject']
    if x['flag_1']==0:
        x.loc['msg','final_flag']=['Missing_item','Error']
    if x['flag_2']==0:
       x.loc['msg','final_flag']=['Find_item','Error']
    return x
dt.apply(replace_dt,axis = 1 )

暫無
暫無

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

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