从列列表创建新列并仅获取 pandas 中的最后一列条件

create new column from a list of columns and get only the last columns condition in pandas

我有这个 table,其中每一行都有不同的状态,放在多列中。这5个状态是其他列的组合,所以有可能是nan_nan.

no   status1                   status2              status3    status4     status5  
1  ifa_accepted_w/comment  ifc_approved             nan_nan     nan_nan     nan_nan
2  ifa_accepted_w/comment  ifc_accepted_w/comment   nan_nan     nan_nan     nan_nan
3  ifa_rejected            ifa_approved             nan_nan     nan_nan     nan_nan
4  ifa_rejected            ifa_approved             nan_nan     nan_nan     nan_nan
5  ifc_approved              nan_nan                nan_nan     nan_nan     nan_nan
6  ifa_accepted_w/comment    ifc_nan                nan_nan     nan_nan     nan_nan

我需要创建新列,其中显示每行的 5 个状态列中的最后一个状态。 我尝试了下面的脚本,首先我定义了我拥有的所有规则,然后我通过从规则映射创建了一个新的 table。

response_rules = {
    "approved": ["ifc_approved"],
    "sub": ["ifc_accepted_w/comment", "ifc_rejected", "ifa_accepted_w/comment"],
    "tp": ["ifc_nan", "ifa_approved"]
}

inverted_rules = {vv: k for k, v in response_rules.items() for vv in v}

df["status"] = df.ffill(axis=1)["status5].map(inverted_rules)

但是脚本不起作用。它在新列中为我提供了 NaN 值,而不是 response_rules.

中的字符串

预期结果是:

no   status1                   status2              status3    status4     status5     status
1  ifa_accepted_w/comment  ifc_approved             nan_nan     nan_nan     nan_nan     approved
2  ifa_accepted_w/comment  ifc_accepted_w/comment   nan_nan     nan_nan     nan_nan     sub
3  ifa_rejected            ifa_approved             nan_nan     nan_nan     nan_nan     tp
4  ifa_rejected            ifa_approved             nan_nan     nan_nan     nan_nan     tp
5  ifc_approved              nan_nan                nan_nan     nan_nan     nan_nan     approved
6  ifa_accepted_w/comment    ifc_nan                nan_nan     nan_nan     nan_nan     tp

我的脚本有什么问题?有没有其他方法可以获得我想要的 table?

谢谢!

我认为您需要将 nan_nan 替换为缺失值:

df["status"] = df.replace('nan_nan', np.nan).ffill(axis=1)["status5"].map(inverted_rules)
#for select ast column is possible use also iloc
#df["status"] = df.replace('nan_nan', np.nan).ffill(axis=1).iloc[:, -1].map(inverted_rules)
print (df)
   no                 status1                 status2  status3  status4  \
0   1  ifa_accepted_w/comment            ifc_approved  nan_nan  nan_nan   
1   2  ifa_accepted_w/comment  ifc_accepted_w/comment  nan_nan  nan_nan   
2   3            ifa_rejected            ifa_approved  nan_nan  nan_nan   
3   4            ifa_rejected            ifa_approved  nan_nan  nan_nan   
4   5            ifc_approved                 nan_nan  nan_nan  nan_nan   
5   6  ifa_accepted_w/comment                 ifc_nan  nan_nan  nan_nan   

   status5    status  
0  nan_nan  approved  
1  nan_nan       sub  
2  nan_nan        tp  
3  nan_nan        tp  
4  nan_nan  approved  
5  nan_nan        tp