【问题标题】:create new column from a list of columns and get only the last columns condition in pandas从列列表创建新列并仅获取熊猫中的最后一列条件
【发布时间】:2021-06-14 12:14:36
【问题描述】:

我有这张表,其中每一行都有不同的状态,放在多列中。这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 个状态列中的最后一个状态。 我尝试了下面的脚本,首先我定义了我拥有的所有规则,然后我通过从规则映射来创建一个新表。

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

我的脚本有什么问题?还有其他方法可以让我得到我想要的桌子吗?

谢谢!

【问题讨论】:

    标签: python pandas mapping


    【解决方案1】:

    我认为您需要将 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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多