如何基于应用于其他两个列的函数更改列中的值

时间:2018-12-09 00:39:43

标签: python pandas

所以我有一个看起来像这样的数据框DF: DF:

match_id        team        teamA_Win  Outcome
1               A           True        None
2               B           True        None
3               A           False       None

此df中的结果列中填充了字符串'None'

我想要的是能够根据team和teamA_win中的值将结果字符串的值更改为“ Win”或“ Loss”。

作为一个例子,如果Team == A并且TeamA_win = True为True,那么结果应该是Win。但是,如果Team == A且TeamA_Win = False,则结果为损失。同样,如果Team == B和TeamA_Win = True,那么结果应该是Loss。

我创建了以下函数:

def win(x):
    if (x['team']=='A')& (x['teamA_win']==True):
        x['outcome']='Win'
    elif ((x['team']=='A')& (x['teamA_win']==False)):
        x['outcome']='Loss'
    elif ((x['team']=='B')& (x['teamA_win']==True)):
        x['outcome']='Loss'    
    elif ((x['team']=='B')& (x['teamA_win']==False)):
        x['outcome']='Win'   

现在,当我调用win(DF)时,出现错误: 系列的真实值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

关于如何解决此问题的任何想法?还是有一种更简单的方法来解决这种情况?

2 个答案:

答案 0 :(得分:0)

您可以使用np.select,这将使您可以定义条件及其可能的值,如下所示:

import pandas as pd
import numpy as np

def win(x):
    conditions = [
        (x['team']=='A') & (x['teamA_win']==True),
        (x['team']=='A') & (x['teamA_win']==False),
        (x['team']=='B') & (x['teamA_win']==True),
        (x['team']=='B') & (x['teamA_win']==False)]

    choices = ['Win', 'Loss', 'Loss', 'Win']

    x['outcome'] = np.select(conditions, choices)

希望有帮助。

答案 1 :(得分:0)

或者使用两层结构,在'Outcome'列中False,然后使用loc检查'team'列是否等于'teamA_Win'替换{{1} }和True一起使用,而'A'False一起使用,则将'B'列设为'Outcome'

True

输出:

df['Outcome']=False
df.loc[df['team']==df['teamA_Win'].map({True:'A',False:'B'}),'Outcome']=True