根据其他列中的值创建新列

时间:2019-02-19 11:35:49

标签: python pandas dataframe

我正在使用FIFA 19数据集,该数据集的“工作率”列存储了球员的进攻和防守工作率,例如(“中/中”)。我想创建另外两个列(紧邻原始列),它们可以分别存储这些功能。我们称它们为“工作率攻击”,“工作率捍卫”。我想不出最好的方法,我一直在考虑应用简单的拆分函数,但它返回ValueError。

def split_work_rate(text, work_type):
    while not pd.isnull(text):
        new_text = text.split('/')
        if work_type == 'Attacking':
            work_rate_attacking = new_text[0]
            return work_rate_attacking
        else:
            work_rate_defending = new_text[1]
            return work_rate_defending


def create_new_work_rates(data):
    cols = ['Work Rate']
    data['Work Rate Attacking'] = data[cols].apply(split_work_rate, args=('Attacking',))
    data['Work Rate Defending'] = data[cols].apply(split_work_rate, args=('Defending',))
    return data
  

ValueError :(“系列的真值不明确。请使用a.empty,   a.bool(),a.item(),a.any()或a.all()。','发生在索引Work   评分”)

1 个答案:

答案 0 :(得分:1)

首先,问题是此行:

if work_type == 'Attacking':

您写这本书时可能会想到pandas会将每一行的值与'Attacking'进行比较,然后转到相应的分支。

但是,实际上,pandas一次将这样的比较应用于整个 Series。因此,与'Attacking'的比较结果不是单个布尔值,而是另一个Series。没有将布尔值Series转换为单个布尔值的明确方法,因此if测试无效。

无论如何,这可能不是最好的方法。试试这个:

data[['Work Rate Attacking', 'Work Rate Defending']] = data['Work Rate'].str.split('/', expand=True)

这使用str访问器将Series拆分为DataFrame,然后可以将其分配给所需的两列。