基于行值创建新列

2024-04-16 16:07:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

    Item    SW_test HW_test QA_test
0   PC      Pass    Pass    Pass
1   Laptop  Fail    Fail    Pass
2   Mouse   Pass    Pass    Fail

我想创建一个最后的列,如果所有测试都通过(不区分大小写),它将给出Pass,如果一个或多个测试失败,它将给出Fail

    Item    SW_test HW_test QA_test Final
0   PC      Pass    Pass    Pass    Pass
1   Laptop  Fail    Fail    Pass    Fail
2   Mouse   Pass    Pass    Fail    Fail

如何在熊猫中创建df['Final']


Tags: 数据testdfpassswitemqa区分
3条回答
cols = ['SW_test', 'HW_test', 'QA_test']
df['Final'] = df[cols].eq('Pass').all(1)
    Item    SW_test HW_test QA_test Final
0   PC      Pass    Pass    Pass    Pass
1   Laptop  Fail    Fail    Pass    Fail
2   Mouse   Pass    Pass    Fail    Fail

您可以应用lambda函数来检查条件所在的位置,然后可以用您想要的任何值替换真/假值。 例如:

#create a dataframe
df = pd.DataFrame({'a':['Pass','Pass'], 'b':['Pass','Fail']})


    a       b
0   Pass    Pass
1   Pass    Fail

在条件适用的位置创建一个新列

df['c'] = df.apply(lambda row: row.a=='Pass' and  row.b=='Pass', axis=1)


    a       b       c
0   Pass    Pass    True
1   Pass    Fail    False

将真/假值替换为要显示的值

df['c'] = df['c'].map({ True: 'Pass', False: 'Fail'})


    a       b       c
0   Pass    Pass    Pass
1   Pass    Fail    Fail

eqall一起使用:

df['Final'] = df.iloc[:,1:].eq('Pass').all(1)
#If case sensitive you can use
df['Final'] = df.iloc[:,1:].isin(['Pass','pass']).all(1)
#or
df['Final'] = df.iloc[:,1:].apply(lambda x: x.str.lower().eq('pass')).all(1)
#or
df['Final'] = df.iloc[:,1:].applymap(str.lower).eq('pass').all(1)

也可以使用np.where,而不是使用map再次映射True/False:

df['Final'] = np.where(df['Final'], 'Pass', 'Fail')

相关问题 更多 >