考虑到我在下面这些列旁边还有另一列,我想通过这 3 列创建一个新列,这些列定义了每行的最终状态。
status_1 status_2 status_3
a_accepted_with_comment a_revised c_approved
a_accepted_with_comment c_rejected nan
a_rejected a_approved nan
a_rejected nan nan
从第 3 列开始,如果具有值的最后一列显示 c_approved 则新列将给予批准
从第 3 列开始,如果具有值的最后一列显示 c_rejected,则新列将被拒绝
从第 3 列开始,如果最后一列有值显示 a_approved 则新列将给出修正
从第 3 列开始,如果具有值的最后一列显示 a_rejected,则新列将被拒绝
决赛桌是这样的:
status_1 status_2 status_3 final_status
a_accepted_with _comment a_revised c_approved approved
a_accepted_with_comment c_rejected nan rejected
b_rejected a_approved nan revised
a_rejected nan nan rejected
如何在 python 中创建具有如此多条件的新列?
提前致谢。
答案 0 :(得分:1)
让我们用 ffill
试试 np.select
s = df.ffill(1).iloc[:,-1]
c1 = s=='c_approved'
c2 = s.isin(['c_rejected','a_rejected'])
c3 = s=='a_approved'
df['new'] = np.select([c1,c2,c3],['approve','rejected','revised'])
df
Out[210]:
status_1 status_2 status_3 new
0 a_accepted_with_comment a_revised c_approved approve
1 a_accepted_with_comment c_rejected NaN rejected
2 a_rejected a_approved NaN revised
3 a_rejected NaN NaN rejected
答案 1 :(得分:1)
您可以使用 ffill
和 map
来跟踪您的每个条件及其结果。
response_rules = {
"c_approved": "approved",
"c_rejected": "rejected",
"a_approved": "revised",
"a_rejected": "rejected"
}
df["final_status"] = df.ffill(axis=1)["status_3"].map(response_rules)
print(df)
status_1 status_2 status_3 final_status
0 a_accepted_with_comment a_revised c_approved approved
1 a_accepted_with_comment c_rejected NaN rejected
2 a_rejected a_approved NaN revised
3 a_rejected NaN NaN rejected
如果您有很多规则,更好的设计模式可能是保留一个易于阅读/可编辑的字典,将结果映射到每个标准,然后在调用 .map
response_rules = {
"approved": ["c_approved"],
"rejected": ["c_rejected", "a_rejected"],
"revised": ["a_approved"]
}
# invert dictionary
inverted_rules = {vv: k for k, v in response_rules.items() for vv in v}
# same as before
df["final_status"] = df.ffill(axis=1)["status_3"].map(inverted_rules)
print(df)
status_1 status_2 status_3 final_status
0 a_accepted_with_comment a_revised c_approved approved
1 a_accepted_with_comment c_rejected NaN rejected
2 a_rejected a_approved NaN revised
3 a_rejected NaN NaN rejected
# Just so you can see:
print(inverted_rules)
{'a_approved': 'revised',
'a_rejected': 'rejected',
'c_approved': 'approved',
'c_rejected': 'rejected'}