从列列表创建新列并仅获取 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
我有这个 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